在Rails中实现每页JavaScript的好方法是什么?
在Ruby中尝试新事物——在每个页面上,我都在用jquery做非常丰富的工作。显然,如果我把所有jquery都放到application.js中,它将非常迅速地增长 这是一种很好的方法,可以在最后延迟加载特定于页面的js文件吗?例如:在Rails中实现每页JavaScript的好方法是什么?,javascript,jquery,ruby-on-rails,Javascript,Jquery,Ruby On Rails,在Ruby中尝试新事物——在每个页面上,我都在用jquery做非常丰富的工作。显然,如果我把所有jquery都放到application.js中,它将非常迅速地增长 这是一种很好的方法,可以在最后延迟加载特定于页面的js文件吗?例如: <script> $(document).ready(function() { $.getScript("/javascripts/this_pages_scripts.js"); }); </script> $(文档).re
<script>
$(document).ready(function() {
$.getScript("/javascripts/this_pages_scripts.js");
});
</script>
$(文档).ready(函数(){
$.getScript(“/javascripts/this_pages_scripts.js”);
});
有没有办法做到这一点?我知道新的.js.erb等文件和ujs,但我仍然在谈论更多特定于页面的js——你知道,拖放初始化器、对话框创建者等等
非常感谢。在标题中设置一个符号来表示文件名,并在控制器中调用它
@script = "prototype"
然后在视图中:
<%= javascript_include_tag @script %>
然后
我使用两种方法: 对于那些只是添加了一点眼花缭乱的小脚本,我经常将它们内联到它们修改的模板中(就像您所展示的那样),因为这样我更容易跟踪它们 对于超过一两行的任何内容,我都会保持低调,但使用
content\u For
我的应用程序布局如下(在HAML中):
重要的部分是yield:scripts
。然后在我需要一些javascript的页面中:
- content_for :scripts do
= javascript_include_tag 'photo_form'
这将在头中加载javascript,但仅当显示给定模板时content\u for
使用相应的名称将内容发送到yield
方法
你可以在任何地方粘贴这样的屈服块--我也有一个屈服块,就在结束体标记之前。产量/内容非常方便
注意,正如塔德曼在评论中指出的那样,任何不需要在头部加载的内容都应该在页面末尾加载
最后要注意的一点是,如果您有更复杂的内容,您还可以在模板和应用程序视图之间使用实例变量。例如,我的应用程序中有一个菜单栏,它位于应用程序布局中。因此,有时我只想在某些页面上触发上下文特定的按钮或附加的按钮行
在我的应用程序布局中,我调用了一个部分来呈现菜单,菜单代码如下所示:
#menubar (normal menu stuff)
- if @special_menu
#special_menu
因此,在任何模板中,您都可以执行以下操作:
- @special_menu = true
。。。对于该页面,将显示给定的菜单。您也可以在控制器操作中执行此操作,我有一个控制器,在其中添加了一个before过滤器,将其中一个菜单标志设置为true。您可以对任何想要有条件地包含的复杂javascript内容集执行相同的操作
我从这部《铁路史》中得到的大部分想法:
你应该看看 我个人使用和一个自定义特征检测库来处理这个问题
然后,我有一行代码将requirejs脚本及其datamain
属性包含在我的layout/master/sharedview页面中。(我对rails本身并不熟悉,但对任何其他MVC都一样)
我在别的地方写了一个很好的答案。您可能可以找到它。然后在每个控制器中使其不同这并不能真正回答关于Rails惯例是如何跨文件构建javascript的大部分问题。顺便说一下,您可以使用splat操作符将数组扩展为la
js=%w{foo bar};javascript_include_tag*js
。只要有可能,javascript文件应该在文档中很晚加载,以避免它们阻碍页面呈现。例如,分析应该是关闭
标记之前的最后一件事。jQuery需要提前加载,其他任何使用$(document).ready(…)
的操作都需要提前加载,原因很明显。当你说“非常快地大”时,你可能有点夸张。20-30KB的JavaScript非常多,但它并不“大”,因为它可以被压缩到3KB左右,并在服务器配置正确的情况下在请求之间缓存。只有像jQueryUI或GoogleMaps这样的大型库才应该引起您的关注,而不在不使用它们的页面上加载这些库会有所帮助。
- content_for :scripts do
= javascript_include_tag 'photo_form'
#menubar (normal menu stuff)
- if @special_menu
#special_menu
- @special_menu = true