Javascript setInterval不';选项卡未激活时,无法正常工作 函数initTimer(timeLeft){ var Me=这个, 总秒数=35, 秒=数学层(时间层); var x=window.setInterval(函数(){ var定时器=秒; if(timer==-1){clearInterval(x);return;} $('#div').html('00:'+(计时器

Javascript setInterval不';选项卡未激活时,无法正常工作 函数initTimer(timeLeft){ var Me=这个, 总秒数=35, 秒=数学层(时间层); var x=window.setInterval(函数(){ var定时器=秒; if(timer==-1){clearInterval(x);return;} $('#div').html('00:'+(计时器,javascript,jquery,setinterval,Javascript,Jquery,Setinterval,我有这个密码。当该选项卡在浏览器中处于活动状态时,一切正常,但当我更改该选项卡并稍后返回该选项卡时,它会出现问题。更准确地说,它不正确地显示时间 我也试过设置超时,但问题是一样的 我有一个想法:HTML5网络工作者 但还有一个问题。。。浏览器支持 有人能帮忙解决这个问题吗? 如何编写setInterval,即使选项卡未处于活动状态,它也能正常工作使用Date对象计算时间。当你要求定时器启动时,不要依赖它(它们不是实时的),因为你唯一的保证是它不会在你要求之前启动。它可能会在很久以后触发,尤其是对

我有这个密码。当该选项卡在浏览器中处于活动状态时,一切正常,但当我更改该选项卡并稍后返回该选项卡时,它会出现问题。更准确地说,它不正确地显示时间

我也试过设置超时,但问题是一样的

我有一个想法:HTML5网络工作者

但还有一个问题。。。浏览器支持

有人能帮忙解决这个问题吗?
如何编写setInterval,即使选项卡未处于活动状态,它也能正常工作

使用
Date
对象计算时间。当你要求定时器启动时,不要依赖它(它们不是实时的),因为你唯一的保证是它不会在你要求之前启动。它可能会在很久以后触发,尤其是对于非活动选项卡。试着这样做:

函数initTimer(periodInSeconds){
var end=Date.now()+periodInSeconds*1000;
var x=window.setInterval(函数(){
var timeLeft=Math.floor((end-Date.now())/1000);
if(timeLeft<0){clearInterval(x);return;}
$('#div').html('00:'+(timeLeft<10?'0'+timeLeft:timeLeft));
},200);
}
初始化计时器(10)

即使选项卡处于活动状态,JavaScript计时器也不可靠。他们只保证至少与您指定的时间相同;没有人能保证这段时间,甚至任何接近这段时间的事情,已经过去了

要解决此问题,每当间隔触发时,请注意现在是什么时间。您实际上只需要跟踪两次:当前时间和前一个间隔触发的时间。通过从当前刻度的时间中减去上一个刻度的时间,您可以知道两个刻度之间实际经过了多少时间,并相应地运行计算

下面是这样的东西的基本轮廓:

function initTimer(timeLeft) {
     var Me = this,
     TotalSeconds = 35,
     Seconds = Math.floor(timeLeft);

     var x = window.setInterval(function() {
         var timer = Seconds;

         if(timer === -1) { clearInterval(x); return; }

            $('#div').html('00:' + (timer < 10 ? '0' + timer : timer));
            Seconds--;

         },1000);
     }
函数initTimer(timeLeft){
var Me=这个,
总秒数=35,
秒=数学层(时间层),
CurrentTime=日期。现在(),
PreviousTime=null;
var x=window.setInterval(函数(){
var定时器=秒,
时间流逝;
PreviousTime=当前时间;
CurrentTime=Date.now();
timePassed=CurrentTime-PreviousTime;
if(timer<0){clearInterval(x);return;}
$('#div').html('00:'+(计时器<10?'0'+计时器:计时器));
秒=秒-时间已过;
},1000);
}

您尝试了哪种浏览器?当选项卡未激活时,浏览器可以并执行对
setInterval
回调的节流调用。在设计代码时需要考虑这一点。计时器不是实时的。如果你让计时器每1秒启动一次,那么它保证你不会在1秒之前启动。可能要晚很多时间(特别是当选项卡处于非活动状态时)。如果您想准确测量时间,请记录启动计时器的时间,然后在每个刻度上使用
Date.now()
进一步计算经过的时间,直到我的观点-即使选项卡处于活动状态,
setInterval
仅保证调用代码之前的最短时间。如果你在做基于时间的计算,最好保持“开始时间”不变,并在此基础上做进一步的计算,而不是增加/减少变量。@MattBurland我看到你已经进一步阐述了我的观点:)
function  initTimer(timeLeft) {
        var Me           = this,
            TotalSeconds = 35,
            Seconds      = Math.floor(timeLeft),
            CurrentTime  = Date.now(),
            PreviousTime = null;

        var x = window.setInterval(function() {
            var timer = Seconds,
                timePassed;
            PreviousTime = CurrentTime;
            CurrentTime = Date.now();
            timePassed = CurrentTime - PreviousTime;

            if(timer < 0) { clearInterval(x); return; }

            $('#div').html('00:' + (timer < 10 ? '0' + timer : timer));
            Seconds = Seconds - timePassed;

        },1000);
    }