我已经编写了一个jQuery插件,除了当你切换到另一个标签时脚本暂停,一切都很好。脚本的主体是setInterval()
,延迟时间为1毫秒。
var count = setInterval( function() {
if (iMil <= 0) {
if (iS == 0) {
if (iMin == 0) {
if (iH == 0) {
// DONE
milliseconds.text(0);
clearInterval(count);
} else {
iH--;
iMin = 59;
iS = 59;
iMil = 999;
}
} else {
iMin--;
iS = 59;
iMil == 999;
}
} else {
iS--;
iMil = 999;
}
} else {
iMil-=4; // Make up for ms lost doing calculations
}
hours.text(iH);
minutes.text(iMin);
seconds.text(iS);
if (iMil >= 10 && iMil < 100) {
milliseconds.text('0'+iMil);
} else if (iMil >= 0 && iMil < 10) {
milliseconds.text('00'+iMil);
} else if (iMil == -1) {
milliseconds.text('000');
} else {
milliseconds.text(iMil);
}
}, 1 );
无论您使用哪个标签,都有办法运行吗?
答案 0 :(得分:3)
出于电源管理的原因,当页面不在前台时,许多浏览器会减慢或停止间隔计时器。
正如我在my earlier response to you中所说的使用相同代码的另一个问题,你不应该维持自己的时间计数,因为setInterval()
不是一个精确的计时器(如你所发现的)。
相反,您应该存储开始时间,然后在每个计时器刻度上获取当前时间并计算实际经过的时间。如果以这种方式执行选项卡,则不会出现任何问题,并且每次调用计时器时,您将始终显示正确的时间。
间隔计时器将是一个显示更新计时器,而不是一个跟踪准确时间的计时器。
所以,如果你想显示经过的时间,你会做这样的事情:
function startTimer() {
var startTime = new Date().getTime();
var timer = setInterval(function() {
var elapsedMilliseconds = new Date().getTime() - startTime;
// now do whatever you want with the elapsedMilliseconds
}, 1);
}