javascript - Rails——ERB 忽略了 JS/jQuery

标签 javascript jquery ruby ruby-on-rails-3 embedded-ruby

我认为下面有以下代码:

<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/

相关文章:

javascript - 如何将页面中的某些标签替换为空

javascript - 将事件类添加到当前页面导航链接

javascript - 我可以使用 JavaScript 来填充 mailto 电子邮件吗?

javascript - chrome.identity.getAuthToken : proper error documentation

javascript - RegEx - 时间验证 ((h)h :mm)

javascript - 狡猾的滚动 Jquery

Ruby:如何创建一个 block 并将其作为参数传递?

ruby-on-rails - Rails后台进程/数据结构

ruby-on-rails - Rails JSON 和 XML 序列化包括微秒

javascript - 如何在 CloudKit JS 中查询元数据?