Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Rails中实现每页JavaScript的好方法是什么?_Javascript_Jquery_Ruby On Rails - Fatal编程技术网

在Rails中实现每页JavaScript的好方法是什么?

在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

在Ruby中尝试新事物——在每个页面上,我都在用jquery做非常丰富的工作。显然,如果我把所有jquery都放到application.js中,它将非常迅速地增长

这是一种很好的方法,可以在最后延迟加载特定于页面的js文件吗?例如:

<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