我正在开发一个
Javascript秒表应用程序,它适用于除Chrome之外的所有浏览器.
这是一个小提琴:
http://jsfiddle.net/djwelsh/Sxyy8/
从理论上讲,它非常简单.单击“开始”按钮会记录epoch time in milliseconds,并启动setInterval.在每个间隔上,从当前纪元时间中减去该起始纪元时间.这给我们留下了一个以毫秒为单位的值,它被转换为h:m:s:cs并显示在页面上.
问题
我的问题在于Chrome.每次计时器达到10000毫秒时,选项卡都会出现“Aw,snap”消息.
一个奇怪的方面是,如果你点击停止,等待几秒钟,然后再次点击开始,崩溃仍然会发生.这似乎表明它是一个内存问题 – 有些东西正在填补它不能再容纳的地步,并且溢出.但是在开发工具和资源监视器中检查内存都没有任何异常.
可能的解决方案
通过将间隔值更改为大于100毫秒的数字(我想要使用的默认值为50)可以避免此问题.由于某种原因,也可以通过在控制台中记录计时器值来避免它.
麻烦的是,除非我知道它为什么会发生,否则我无法确信这些快速解决方案实际上是在解决问题.在我知道它可以在所有当前浏览器中运行之前,我不想发布该页面.
我知道这似乎是一个相当狭窄的问题,但我希望这个解决方案能够揭示一些可能对其他人有帮助的东西(Chrome的计时器功能或其他东西的特质).
编辑
顺便说一句,我知道停止并重新启动计时器并不像真正的秒表那样工作;我尚未完成该部分的实施.我认为最好尽量保持SO尽可能简单.
供参考(和正义),这是更新版本.仍在10000崩溃:
http://jsfiddle.net/djwelsh/Sxyy8/7/
解
根据@Akhlesh的回答,我更新了小提琴.它现在运行正常,就像一个秒表:http://jsfiddle.net/djwelsh/Sxyy8/18/
如果您想知道,我需要使用基于纪元的技术(而不是仅仅增加基值),因为有时内存使用问题导致间隔不会每秒调用 – 如果选项卡移动到背景而例如,计时器仍在运行.
最佳答案 您可以通过将时间变为全局来避免选项卡崩溃,而不是再次在Update函数中再次创建这些变量.
var uTime,uNow;
//Update function will use same variable to initialize time and now
updateTime: function () {
uNow = Date.now();
oO.milliseconds = uNow - oO.epoch;
uTime = oO.getTimeObject(oO.milliseconds);
oO.el.testClock.text('' + uTime.h + ':' + uTime.m + ':' + uTime.s + ':' + uTime.ms + '');
}
我不确定原因,但我认为GC无法解除分配这些变量,同时分配新变量并导致崩溃.