我认为下面有以下代码:
<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 语句的条件为假,因此永远不应执行该 block 。然而由于某种原因,它就像我的 JS 不存在并且正在调用 ERB block 。为什么会这样? JS 似乎在网站的其他页面上运行良好。
如果您需要有关此的更多信息以帮助解决问题,请提出来,我会尽力提供尽可能多的信息。
最佳答案
您似乎对服务器端和客户端代码之间的区别有点困惑。
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 调用。
关于javascript - Rails——ERB 忽略了 JS/jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6825390/