毫秒不同步

我正在使用Javascript / jQuery开发秒表应用程序。 问题是毫秒值与REAL毫秒不同步。 我正在使用函数setInterval() ,间隔为1 millisecond ,仍然是导致此问题。

jsFiddle: http : //jsfiddle.net/FLv3s/

请帮忙!

使用setInterval触发更新,但使用系统时间(通过new Date() )进行实际时间计算。

使用任何语言(而不仅仅是JavaScript)执行程序都不是实时的。 实际运行代码以增加计数器并更新视图需要花费很少的时间,并且会关闭“计时”。

此外,许多浏览器都有一个“最小超时”长度,它在4到16之间变化(后者是计算机自己的时钟计时器),这将真正搞乱你的代码。

相反,您应该使用增量计时

 var startTime = new Date().getTime(); setInterval(function() { var elapsed = new Date().getTime()-startTime; // update view according to elapsed time },25); 

如果您担心它看起来不稳定,请考虑使用requestAnimationFrame ,每帧只更新一次计时器 – 这有一个额外的好处,即当用户切换标签时不更新(但它仍然会计时),因为如果选项卡不活跃,然后没有必要重绘东西。

老实说,我尝试了几乎与你现在完全相同的事情(仅用Javascript创建一个准确的节拍器) – 总而言之:简单地说,毫秒(或更低)绝对准确可能不可能仅限javascript。

为了更深入了解,我推荐这个问题: JavaScript是否提供高分辨率计时器?

或者更准确地说这篇博客文章: http : //ejohn.org/blog/how-javascript-timers-work/

最好的问候,多米尼克

您可以使用新的performance对象来获得更准确的时间。 将它与requestAnimationFrame而不是setInterval结合使用:

 var startTime = performance.now(), currentTime, isRunning = true; loop(); function loop(timeElapsed) { currentTime = performance.now(); if (isRunning) requestAnimationFrame(loop); } 

只需从currentTime减去startTime

我留下了timeElapsed ,其中包含了timeElapsed所用的时间,你可以将其用于某些东西(或者只是忽略它)。

但需要注意的是:并非所有浏览器都支持此function(有些可能使用前缀),因此对于移动设备,您需要使用标准系统时间对象。