以下本身不是问题,因为可以通过两个资产管道文件不使用相同的名称来避免这种情况。我只是对解释感到好奇,所以感谢您的任何见解。
这是 Rails 3.2.6,sprockets 2.1.4(也尝试过最新的 2.4.4)。一个最小的例子:http: //github.com/richardkmichael/js-test
我有一个FooController
,并且正在编写 javascript 而不是咖啡脚本,所以我创建了一个新文件foo.js
,但留下了一个空的foo.js.coffee
.
我有一个readyState === 'complete'
用 clearInterval() 停止的 setInterval() 函数(测试)。但是,interval 函数会循环,就好像clearInterval()
调用不起作用一样。
当我删除空foo.js.coffee
文件时,循环停止并且 JS 按预期工作。替换空foo.js.coffee
的会再次启动客户端上的循环行为。
服务器端处理似乎正在改变客户端的某些东西,导致重置/新的间隔计时器?
这两种情况之间似乎没有客户端 JS 差异。但是,在 Chrome 的网络检查器中:
“资源”列表一次,并且在两种情况下都包含在服务器端
foo.js
出现的 JS 。包含一个分号。(此外,即使我删除了 jQuery,这种循环行为仍然存在。)foo.js
application.js
“来源”(本地主机/资产)列出了
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`>
一个(也许)类似的问题:链轮重复文件命名
更新
根据回复,我注意到有两个<script>
标签(事后看来相当明显)。console.log
测试 Frederick 的解释,我更改了 javascript 以避免丢失第一个计时器引用,并且它按预期“工作”(恰好两次写入)。
/*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);
}());