2012-04-12 64 views
5

我有一个JavaScript程序像这样:为什么不是第二个正确的长度?

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1); 

你可以在我的代码,我乘以1000,然后用1000除以看到,这是因为我希望通过一毫秒每次递增,但显示“时间”输出格中的秒数。但是,当我打开其中包含此代码的页面时,如果明白我的意思,那么第二个实际上并不是“第二个”。这比正常的时间长三倍,我不知道为什么。

那么,什么是我的代码的问题,我能做些什么来解决这个问题?

感谢

卢卡斯

+1

您可以发布的 “时间” 值? – 2012-04-12 07:56:48

+1

我认为这是因为你调用addTime();每毫秒。这意味着您的导航器无法一定处理的每秒千次呼叫,因此您会看到该数字增长速度比应该慢。 – Salepate 2012-04-12 07:57:32

+0

那么我应该怎么做才能解决这个问题,以及“post”时间“价值”是什么意思? – think123 2012-04-12 07:58:09

回答

4

的问题是,JavaScript是不能保证调用的setInterval正好您指定的时间,但在第一次机会是有时间之后。另外,在很多(所有?)浏览器的分辨率下,1ms是无效的。

为此得当,得到的开始时间,然后减去当前时间找出经过毫秒。

var start = new Date(); 
var update = function() { 
    var now = new Date(); 
    var elapsed = now - start; 
    // now you can do something with `elapsed`, 
    // like stuff it into the UI 
}; 
setInterval(update, 100); 
+0

+1电流启动的确是要走的路。这样,即使浏览器“挂起”了几秒钟,之后也会自动更正。 – Konerak 2012-04-12 08:00:20

0

因为setInterval采用参数作为milisecond,我想你应该1000

function addtime() { 
    curtime = document.getElementById("time").value * 1000; 
    curtime += 1; 
    document.getElementById("time").value = curtime/1000; 
} 
setInterval(function() { 
    addtime(); 
}, 1000); 
+0

通过'setInterval'保持时间已知是不准确的,应该不鼓励。 – Amadan 2012-04-12 08:02:46

+0

@Amadan:请给我详细的介绍。我无法理解。 – sarwar026 2012-04-12 08:04:36

+0

查看Joseph的回答链接。 – Amadan 2012-04-12 08:05:20

3

这里更换1a video,其中J. Resig的解释JavaScript的怎么也innacurate定时器,在上下文中他的介绍如何使用定时器在测试中。

“OSX计时器是准确的,到milisecond,但在Windows中,计时器只每15ms的更新。”

这里的another article由N. Zakas指出,计时器分辨率在某些情况下是不同的,它也取决于浏览器。 1ms的分辨率很快,但CPU处理速度会很快,这就是浏览器将其拉回的原因。据我所知,当选项卡没有焦点时,浏览器会减少定时器(以及渲染)。我在这里看到了很多,特别是在慢速PC中,同一页面一次打开4个标签,只有一个焦点先呈现(顺时针快速图标),而其他人继续加载(计数器 - 向右加载图标)。

+0

+1,很好的链接。 – Amadan 2012-04-12 08:04:36

+0

同意了,但我使用了一个mac。 – think123 2012-04-12 10:01:25

+0

那么,这可能是由于浏览器,以及其他因素。我还没有找到解释大部分的文档,只是我提供的文档。 – Joseph 2012-04-12 10:03:14

1

如果你想间隔的第二组第二的间隔,而不是增加的毫秒时间按秒增加它。那么你也可以简化你的价值更新代码。

看到这里http://jsfiddle.net/NGTXU/

setInterval(function() { 
    document.getElementById("time").value++; 
},1000); 
相关问题