如何处理Javascript定时器不准确?

如何处理Javascript定时器不准确?,javascript,jquery,timer,Javascript,Jquery,Timer,因此,我试图通过本文中接受答案下的答案在Javascript中实现一个精确的计时器。我所做的唯一更改是在某个Javascript事件初始化(如打开lightbox)时初始化一个事件\u last\u occurrence\u time。我的想法是,每4秒钟,我就会关闭一个灯箱,当页面第一次打开时,它会弹出 我注意到lightbox实际上在1-2秒内关闭,而在浏览器启动的第一个实例中是4秒。所以我做了console.logappeased-event\u last\u occurrence\u t

因此,我试图通过本文中接受答案下的答案在Javascript中实现一个精确的计时器。我所做的唯一更改是在某个Javascript事件初始化(如打开lightbox)时初始化一个事件\u last\u occurrence\u time。我的想法是,每4秒钟,我就会关闭一个灯箱,当页面第一次打开时,它会弹出

我注意到lightbox实际上在1-2秒内关闭,而在浏览器启动的第一个实例中是4秒。所以我做了console.logappeased-event\u last\u occurrence\u time并跟踪我的秒表-似乎下面的计时机制在初始化时比真实世界的时间移动得更快-至少我可以通过console.log看到这一点-它跳到5-10秒,而我的秒表仍在2秒左右

1这就是Javascript中计时机制的本质,还是下面的算法中有一个我没有发现的明显缺陷

var start = new Date().getTime(),  
    time = 0,  
    elapsed = '0.0'
    event_last_occurrence_time = elapsed;  
function instance()  
{  
    time += 100;  
    elapsed = Math.floor(time / 100) / 10;  
    if(Math.round(elapsed) == elapsed) { elapsed += '.0'; }  

    if ((elapsed-event_last_occurrence_time)%4==0) { $.lightBox.close() }      

    document.title = elapsed;  
    var diff = (new Date().getTime() - start) - time;  
    window.setTimeout(instance, (100 - diff));  
}  
window.setTimeout(instance, 100); 

$("#some_id").click(function(e) 
{

$.lightBox({ 
            onOpen: function () 
            {
              instance();
              event_last_occurrence_time = elapsed;
            }
        });

});

4秒在电脑上是很长的时间。任何误差都应该在毫秒范围内-只需使用正常的setTimeoutcallback,4000。你的大括号没有正确匹配。if中应该包含什么?您可以制作一个JSFIDLE来显示问题吗?我试着复制你的代码,但丢失的大括号把它弄糟了。有什么东西应该在最后一次更新事件吗?@Barmar:大括号在评论的末尾。我编辑了这个问题来解决它。而且,你到处都在混合字符串、浮点和整数计算。JS当然会做一些转换,但是当你这样做的时候,很难判断什么是正确的,什么是不正确的。%4也是可疑的,因为左操作数不是整数。应该有一个>在那里的某个地方,因为经过的时间不会是精确的。而且您永远不会重置事件上次发生的时间,所以您最好使用0来代替它。而且new Date.getTime很脆弱——用户可以更改时钟,也可以使用夏令时。最后,您应该使用diff而不是所有的100。