使用带有haml,sass和coffeescript的Rails 3.2.0: 基本上我试图用ajax禁用jQuery_Mobile加载页面,而不必在我的任何视图中包含一大堆javascript。
我试过了:
13 //= require jquery¬
14 //= require jquery_ujs¬
15 //= require_tree .¬
16 $(document).bind("mobileinit", function() {¬
17 $.mobile.ajaxEnabled = false;¬
18 });¬
19 //= require jquery_mobile¬
没有成功,我没有完全理解调用= javascript_include_tag "application"¬
时的事件链以及// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD GO AFTER THE REQUIRES BELOW.¬
的含义?
答案 0 :(得分:2)
一旦运行了所有其他require指令,您在application.js清单文件中放置的任何内容都将在该文件的底部执行。
您想要的是将此代码放在javascript文件中(称之为jquery_mobile_startup.js
)并将require 'jquery_mobile_startup.js'
放在文件的顶部。
Sprockets尊重你把东西放在那里的顺序,require_tree不会重新导入你已导入的东西。
对此进行扩展:
正在读取application.js作为要包含的文件的清单文件,并且在生产环境中运行时,Sprockets / Rails会将清单中所需的所有文件合并到一个大的缩小的JavaScript文件中,并将其提供给用户。 只有在开发过程中,<%= javascript_include_tag 'application' %>
才会为您生成多个标记。
所有require调用都会生成一个标记,所有常规Javascript代码将保留在application.js中,该文件将在所有导入的文件(在开发中)之后导入。
答案 1 :(得分:1)
require
指令在服务器端由Sprockets(资产管道)处理。 Coffeescript / Sprockets不会执行任何Javascript。当您使用javascript_include_tag "application"
时,管道会加载清单文件(application.js)并处理require
语句以便为您的Javascript提供服务。
在开发过程中,它会为您的视图添加多个<script>
标记。
对于生产,rake assets:precompile
允许您请求Sprockets编译application-hash.js
文件(哈希值允许缓存/版本化您的资产)并向视图添加单个<script>
标记
无论如何,如果您需要将Javascript代码放入清单(不良做法恕我直言),您应该在require
指令之后添加它。
如果您需要避免加载不必要的Javascript,策略可能是根据用户的浏览器过滤包含的文件:创建另一个JS清单并根据HTTP_USER_AGENT
标头决定使用哪一个。一个简单的例子:
# app/helpers/user_agent_helper.rb
def iphone?
request.env["HTTP_USER_AGENT"] && /iPhone/=~request.env["HTTP_USER_AGENT"]
end
# app/viewss/layouts/application.html.erb
...
<head>
<%= javascript_include_tag iphone? ? 'iphone' : 'application' %>
</head>
# app/assets/javascripts/iphone.js
//= require jquery
//= require jquery-mobile
//= require your-iphone-specific-js