带有foo.js和foo.js.coffee(空)的Rails资产管道导致js循环.为什么?
Rails asset pipeline with foo.js and foo.js.coffee (empty) results in JS loop. Why?
以下内容本身不是问题,因为可以通过不对两个资产管道文件使用相同的名称来避免。我只是好奇一个解释,所以谢谢你的任何见解。
这是轨道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(。但是,interval函数会循环,就好像clearInterval()
调用不起作用一样。
当我删除空的foo.js.coffee
文件时,循环停止,JS按预期工作。替换空的foo.js.coffee
会再次启动客户端上的循环行为。
服务器端处理似乎正在更改客户端的内容,从而导致重置/新建间隔计时器?
这两种情况之间似乎没有客户端JS的区别。然而,在Chrome的网络检查器中:
-
"Resources"列出了
foo.js
一次,在这两种情况下都包含与foo.js
服务器端相同的JS。application.js
包含一个分号。(除此之外,即使我删除了jQuery,这种循环行为仍然存在。) -
"源"(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`>
一个(也许)类似的问题:链轮重复文件命名
更新
根据这些回复,我注意到有两个<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被包含了两次。网络检查器可能只显示一次,因为浏览器足够智能,不会再次提取相同的文件
当您的第一个Javascript副本运行时,它会创建计时器并将其值存储在readyStateCheckInterval
中,以便以后可以取消它。第二个副本创建第二个计时器,并用新值覆盖readyStateCheckInterval
的值。然后,您的回调两次尝试取消第二个计时器,但从未取消第一个计时器(因为您现在已经丢失了对它的引用)
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 强制模板刷新ember.js
- 如何编写HTML输入的JS内联
- Angular JS IE9 Hashbang url rewriting
- 使用JS将数组转换为json对象
- Node.js v6.2.0类扩展不是函数错误
- 当js函数's已执行
- 要求未定义JS回调参数
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 带有foo.js和foo.js.coffee(空)的Rails资产管道导致js循环.为什么?
- 无法在 js 中打印 foobar 只能打印 foo 和 bar
- JS:将字符串“foo[bar]”转换为代码 obj.foo.bar 的简单方法
- JS-import'中@的含义@foo/bar'
- jquery.carouFredSel-6.2.1.js中找不到Foo元素
- 如何编写JS函数foo(baz),其中baz是:函数baz(para){alert(para.data);}
- jQuery.ajax({url:'foo.js',dataType:'script',
- Js的foo(), foo和function(){foo()}的区别