本身並不是一個問題,因爲可以通過不使用兩個資產管道文件的相同名稱來避免這種情況。我只是對一個解釋感到好奇,所以謝謝你的任何見解。帶有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);
}());
爲了記錄,你可以把香草JavaScript放到一個coffeescript文件中, 。你不需要創建一個單獨的文件。 CoffeeScript的黃金法則是:「這只是JavaScript」 – DVG 2012-07-09 15:38:11
是的,謝謝,我知道這一點。部分原因是我認爲sprockets可能只是將* .js,* .coffee.js和其他引擎中的所有內容連接起來並全部提供。 – 2012-07-10 08:14:52
'foo.js'和'foo.js.coffee'都存在的情況下'