在// = require发生之前执行javascript

时间:2012-02-07 07:51:40

标签: javascript ruby-on-rails jquery-mobile

使用带有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.¬的含义?

2 个答案:

答案 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