Dav*_*ave 9 javascript jquery ruby-on-rails
在Ruby中尝试新事物 - 在每个页面上我都在用jquery做很丰富的东西.显然,如果我把所有jquery都放到application.js中,它会很快变大.
在最后延迟加载特定于页面的js文件是一种好方法吗?例如:
<script>
$(document).ready(function() {
$.getScript("/javascripts/this_pages_scripts.js");
});
</script>
Run Code Online (Sandbox Code Playgroud)
这样做有轨道方式吗?我知道new.js.erb等文件和ujs,但我仍然在谈论更多特定于页面的js - 你知道,拖放初始化器,对话框创建器等.
非常感谢你.
And*_*rew 12
我使用两种方法:
对于那些只是添加一点点眼花缭乱的微小,琐碎的脚本,我经常将它们内嵌在他们修改的模板中(就像你已经显示的那样),因为我更容易跟踪这种方式.
对于任何超过一两条小线的东西,我保持不引人注目,但加载它 content_for
我的应用程序布局如下所示(在HAML中):
= javascript_include_tag 'jquery.144.min','rails','jquery.tools','application'
= yield :scripts
Run Code Online (Sandbox Code Playgroud)
重要的是yield :scripts
.然后在我需要一些javascript的页面中:
- content_for :scripts do
= javascript_include_tag 'photo_form'
Run Code Online (Sandbox Code Playgroud)
这会在标头中加载javascript,但仅在显示给定模板时才会加载.使用相应的名称content_for
将东西发送到yield
方法.
你可以在任何地方粘贴一个yield块 - 我也有一个就在关闭body标签之前.Yield/content_for非常方便.
请注意,tadman在评论中指出,任何不必在头部加载的内容都应该在页面末尾加载.
最后要注意的是,如果你有更复杂的东西,你也可以在模板和应用程序视图之间使用实例变量.例如,我的应用程序中有一个菜单栏,它位于应用程序布局中.因此,有时我想仅在某些页面上触发特定于上下文的按钮或其他按钮行.
在我的应用程序布局中,我调用了一个部分呈现菜单,菜单代码如下所示:
#menubar (normal menu stuff)
- if @special_menu
#special_menu
Run Code Online (Sandbox Code Playgroud)
那么,在任何模板中你都可以做到:
- @special_menu = true
Run Code Online (Sandbox Code Playgroud)
...对于该页面,将显示给定的菜单.你也可以在控制器动作中执行此操作,我有一个控制器,我添加了一个前置过滤器,将其中一个菜单标志设置为true.对于您可能希望有条件地包含的任何复杂的javascript内容,您可以执行相同的操作.
我从看这个railscast获得的大部分想法:http: //railscasts.com/episodes/30-pretty-page-title
你应该看看!