1

本身並不是一個問題,因爲可以通過不使用兩個資產管道文件的相同名稱來避免這種情況。我只是對一個解釋感到好奇,所以謝謝你的任何見解。帶有foo.js和foo.js.coffee(空)的Rails資產管道導致JS循環。爲什麼?

這是Rails 3.2.6,鏈輪2.1.4(也試過最新的,2.4.4)。小例子:http://github.com/richardkmichael/js-test

我有一個FooController,和我編寫JavaScript不是CoffeeScript的,所以我創建了一個新的文件foo.js,卻留下一個空foo.js.coffee

我有一個setInterval()函數(測試readyState === 'complete')與clearInterval()停止。但是,間隔函數會循環,就好像clearInterval()調用不起作用。

當我刪除空的foo.js.coffee文件時,循環停止並且JS按預期工作。替換空的foo.js.coffee將再次啓動客戶端上的循環行爲。

服務器端處理似乎正在改變東西客戶端,導致重置/新的間隔定時器?

這兩種情況似乎沒有客戶端JS差異。然而,在Chrome的Web檢查:

  • 「資源」名單foo.js一次,在這兩種情況下正好包含了JS,因爲它出現foo.js服務器端。 application.js包含一個單獨的分號。 (另外,即使我刪除了jQuery,這種循環行爲仍然存在。)

  • 'Sources'(localhost/assets)列出了foo.js?body=1兩次。

app/controllers/foo_controller.rb

class FooController < ApplicationController 
    def index 
    render :inline => '<p>Hello, World!</p>', :layout => true 
    end 
end 

app/assets/javascripts/foo.js

var readyStateCheckInterval = setInterval(function() { 
    if (document.readyState === 'complete') { 
    console.log('Document ready.'); 
    clearInterval(readyStateCheckInterval); 
    } 
}, 2000); 

app/assets/javascripts/foo.js.coffee

<empty -- just `touch .../foo.js.coffee`> 

A(或許)類似的問題:sprockets duplicate file naming

UPDATE

基礎上的反應,我注意到有兩個<script>標籤(在事後相當明顯)。測試Frederick的解釋,我改變了javascript以避免丟失第一次定時器引用,並且它「正常」(正好兩次寫入console.log)。

/*jslint indent: 2 */ 

(function() { 

    'use strict'; 

    var intervalTimers = {}, 
    date = new Date(), 
    time = date.getTime(); 

    function setupIntervalTimer(name) { 
    intervalTimers[name] = setInterval(function() { 
     if (document.readyState === 'complete') { 
     console.log('Document ready.'); 
     clearInterval(intervalTimers[name]); 
     } 
    }, 2000); 
    } 

    setupIntervalTimer(time); 

}()); 
+0

爲了記錄,你可以把香草JavaScript放到一個coffeescript文件中, 。你不需要創建一個單獨的文件。 CoffeeScript的黃金法則是:「這只是JavaScript」 – DVG 2012-07-09 15:38:11

+0

是的,謝謝,我知道這一點。部分原因是我認爲sprockets可能只是將* .js,* .coffee.js和其他引擎中的所有內容連接起來並全部提供。 – 2012-07-10 08:14:52

+1

'foo.js'和'foo.js.coffee'都存在的情況下'