4

在我看来,我有一些代码是这样的

$(".someclass").hover(function(){
    $(this).append("#{render "layouts/show_some_file", title: "some_file"}");
});

show_some_file.html.haml文件由两个嵌套的基本 div 组成

在我的浏览器中,我得到

$(".someclass").hover(function(){
    $(this).append("<div>
        <div>some text</div>
        </div>
    ");
});

悬停时,我进入我的 chrome 控制台SyntaxError: Unexpected token ILLEGAL。我删除了控制台中的空格,它起作用了。但是如何清理我的红宝石渲染中的空白?

4

4 回答 4

3

我不完全确定它会有所帮助,但您可能应该使用"<%= render ... %>"变体而不是#{}

而且因为它是用于javascript的,所以正确的方法是"<%= escape_javascript(render ...) %>"

如果使用 HAML,请将 ERB 替换为其中写入的标记。

编辑:可能是 != "$(this).append("#{escape_javascript(render "layouts/show_some_file", title: "some_file")}");"

于 2013-06-20T13:56:32.730 回答
3

由于您的结果{#render}是 HTML,尽管您可能会使用一次,但将其存储在 HTML 中并使用 JavaScript 检索它可能更有意义。模仿模板,这是我的意思的一个例子:

<script id="my_render" type="text/template">
    #{render "layouts/show_some_file", title: "some_file"}
</script>

<script type="text/javascript">
    $(document).ready(function () {
        var render_content = $("#my_render").html();
        $(".someclass").hover(function () {
            $(this).append(render_content);
        });
    });
</script>

它有点像模板。您使用了一个script标签,但您将其设置type为不会导致它被执行的东西。由于script标签在页面上永远不可见,因此您永远不会有视觉问题......不像在 div 内这样做......然后 HTML 与页面的其余部分“分离”。

我确信使用 Ruby 有更好的解决方案,但是如果您要输出 JavaScript 代码的部分视图,我不得不问为什么。放入“模板”对我来说更有意义。我知道这并不能直接回答您的直接问题,但它是另一种选择:)

于 2013-06-20T13:42:40.760 回答
2

事实上,我明白了,正确的做法之一是:

$("someclass").hover(function(){
            $(this).append("#{escape_javascript render "layouts/show_some_file", title: "some title"}");
          });
于 2013-06-20T14:13:12.623 回答
-1

显而易见的事情是编辑 layouts/show_some_file 并删除空白。真正的问题不是空格,而是回车。Javascript 不喜欢多行字符串。如果我了解 Ruby,我可能会编写一个正则表达式来摆脱诸如“\r\n”之类的东西,这是 PHP/C 语法中的回车换行符。

于 2013-06-20T13:34:35.847 回答