1

在我看来,我有以下代码:

<script type="text/javascript">    
  $(document).ready(function(){    
    $("#button").click(function(event){
      if(false) { //even with if (false), this code is still being executed!
        <% if obj %>
          <% my_method(obj) %>
        <% end %>
        $("#button").attr("href","/" + obj.my_path);
      }
    });        
  });
</script>

正如您在注释中看到的那样,JavaScript if 语句的条件为假,因此永远不应该执行该块。然而由于某种原因,它就像我的 JS 不存在并且正在调用 ERB 块。为什么会这样?JS 似乎在网站上的其他页面上运行良好。

如果您需要有关此的更多信息以帮助解决问题,请尽管提出,我会尽力提供尽可能多的信息。

4

2 回答 2

5

您似乎对服务器端代码和客户端代码之间的区别有些困惑。

ERB 在服务器上执行,JavaScript 在客户端上执行。当你的 ERB 被执行时,Ruby 几乎可以看到:

puts '<script type="text/javascript">'
puts '  $(document).ready(function(){'
puts '    $("#button").click(function(event){'
puts '      if(false) {'
if obj
  my_method(obj)
end
puts '        $("#button").attr("href","/" + obj.my_path);'
puts '      }'
puts '    });'       
puts '  });'
puts '</script>'

再简化一点,ERB 可以归结为如下内容:

puts some_strings[0]
puts some_strings[1]
puts some_strings[2]
puts some_strings[3]
if obj
  my_method(obj)
end
puts some_strings[4]
puts some_strings[5]
puts some_strings[6]
puts some_strings[7]
puts some_strings[8]

当你打开 ERB 时,为什么my_method(obj)要执行就很明显了。

在 ERB 领域,你所有的 JavaScript 只是一堆未解释的字符串:你的 JavaScript 只是一堆无意义的文本,直到它到达客户端浏览器。

然后,浏览器会看到如下内容:

<script type="text/javascript">    
  $(document).ready(function(){    
    $("#button").click(function(event){
      if(false) {
        $("#button").attr("href","/" + obj.my_path);
      }
    });        
  });
</script>

您的 ERB 无处可见,因为它是在服务器上处理的。但是,您if(false)会被看到,它将由客户解释。但是,您的 ERB 已经运行,因此if(false)不会影响您的my_method(obj)Ruby 调用。

于 2011-07-26T08:45:40.733 回答
0

ERB 代码是Ruby代码,它对 JavaScript 一无所知,if 只是它的标记。如果您不想执行 ERB 代码,请修复 erb 代码中的 if,而不是 JavaScript。

于 2011-07-26T05:10:46.747 回答