【发布时间】:2017-02-10 00:03:09
【问题描述】:
尝试构建一个非常简单的 Javascript 倒计时。但是,只要选项卡处于非活动状态,倒计时就会开始滞后并保持不正确的计数。
请参见此处的 jsfiddle,例如:https://jsfiddle.net/gbx4ftcn/
function initTimer(t) {
var self = this,
timerEl = document.querySelector('.timer'),
minutesGroupEl = timerEl.querySelector('.minutes-group'),
secondsGroupEl = timerEl.querySelector('.seconds-group'),
minutesGroup = {
firstNum: minutesGroupEl.querySelector('.first'),
secondNum: minutesGroupEl.querySelector('.second')
},
secondsGroup = {
firstNum: secondsGroupEl.querySelector('.first'),
secondNum: secondsGroupEl.querySelector('.second')
};
var time = {
min: t.split(':')[0],
sec: t.split(':')[1]
};
var timeNumbers;
function updateTimer() {
var timestr;
var date = new Date();
date.setHours(0);
date.setMinutes(time.min);
date.setSeconds(time.sec);
var newDate = new Date(date.valueOf() - 1000);
var temp = newDate.toTimeString().split(" ");
var tempsplit = temp[0].split(':');
time.min = tempsplit[1];
time.sec = tempsplit[2];
timestr = time.min + time.sec;
timeNumbers = timestr.split('');
updateTimerDisplay(timeNumbers);
if (timestr === '0000')
countdownFinished();
if (timestr != '0000')
setTimeout(updateTimer, 1000);
}
function animateNum(group, arrayValue) {
TweenMax.killTweensOf(group.querySelector('.number-grp-wrp'));
TweenMax.to(group.querySelector('.number-grp-wrp'), 1, {
y: -group.querySelector('.num-' + arrayValue).offsetTop
});
}
setTimeout(updateTimer, 1000);
}
我不确定问题出在动画还是 JS 代码本身。
为了澄清:我希望在选项卡处于非活动状态时继续倒计时,或者在选项卡重新聚焦时“赶上自己”。
我知道setTimeout 和setInterval 会导致非活动标签出现问题,但我不完全确定如何解决此问题。
任何帮助将不胜感激!
【问题讨论】:
-
请删除任何与特定问题无关的代码
-
提示:将结束时间存储为日期,并始终根据现在和结束之间的差异进行计算
-
@alexwc_ 该链接是相关的,但没有为这种情况提供解决方案,所以它不是真正的重复
-
如果可以使用 service worker,请使用 Task scheduler
标签: javascript css animation countdown gsap