2012-02-07 77 views
0

在haml,sass和coffeescript中使用Rails 3.2.0: 基本上我試圖禁用jQuery_Mobile加載ajax頁面,而不必在任何視圖中包含javascript buch。在// = require require之前執行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

一旦您運行了所有其他require指令,您放入application.js清單文件中的任何內容都將在該文件的底部執行。

你想要的是把這段代碼放在一個JavaScript文件中(稱之爲jquery_mobile_startup.js),並把一個require 'jquery_mobile_startup.js'置於文件的頂部。

鏈輪獎勵您放入東西的訂單,並且require_tree不會重新導入您已經導入的東西。

爲了擴展這個有點:

的application.js被解讀爲哪些文件包括清單文件,並在生產鏈輪運行時/ Rails會合並所需的清單到一個所有文件大縮小的JavaScript文件並將其提供給用戶。 只有在開發中,<%= javascript_include_tag 'application' %>纔會爲您生成多個標籤。

所有需要調用都會生成一個標籤,所有常規的Javascript代碼將保留在application.js中,這些代碼將在所有導入的文件(開發中)後導入。

1

require指令在服務器端由Sprockets(資產管道)處理。 Coffeescript/Sprockets不會執行任何Javascript。當您使用javascript_include_tag "application"時,管道將加載清單文件(application.js)並處理require語句以爲您的Javascript提供服務。

在開發中,它會爲您的視圖添加幾個<script>標記。

對於生產,rake assets:precompile讓你問鏈輪編譯一個application-hash.js文件(哈希值可以讓你的資產的緩存/ versionning),並添加一個<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