通过自我调节让 JavaScript 前端倒计时不再纠偏
2024-01-09 08:44:24
前端网页倒计时是一个非常常见的应用,在各大购物网站的秒杀活动中总是能见到它的身影。但是在实际情况中,当网页不刷新、让倒计时程序持续运行时,显示时间相比实际时间会越来越慢,相信大家也有在秒杀时间即将到来时不停刷新页面的经历。原因自然也不难理解:倒计时通常使用定时器(如 JavaScript 的 setInterval()
函数)来实现,而这些定时器在实际运行时可能会受到各种因素的影响,例如系统负载、浏览器性能等,导致执行时间不稳定,从而导致倒计时纠偏。
为了解决这个问题,我们可以采用 JavaScript 前端倒计时自我调节的方法来实现纠偏。自我调节是指在倒计时程序运行时实时监测其与实际时间的差距,并根据差距对定时器的执行时间进行调整,从而使显示时间与实际时间保持一致。
下面是一个简单的 JavaScript 前端倒计时自我调节的实现示例:
function Countdown(targetTime, callback) {
this.targetTime = targetTime;
this.callback = callback;
this.interval = null;
this.startTime = null;
this.elapsedTime = 0;
this.lastExecutionTime = 0;
this.drift = 0;
}
Countdown.prototype.start = function() {
this.startTime = Date.now();
this.interval = setInterval(this.tick.bind(this), 100);
};
Countdown.prototype.stop = function() {
clearInterval(this.interval);
this.interval = null;
};
Countdown.prototype.tick = function() {
var now = Date.now();
this.elapsedTime = now - this.startTime;
var expectedElapsedTime = now - this.lastExecutionTime;
this.drift += expectedElapsedTime - this.elapsedTime;
var adjustedInterval = 100 + this.drift;
this.lastExecutionTime = now;
if (this.elapsedTime >= this.targetTime) {
this.stop();
this.callback();
} else {
setTimeout(this.tick.bind(this), adjustedInterval);
}
};
这个示例中的 Countdown
类提供了一个可用于创建和管理倒计时的简单 API。targetTime
参数指定了倒计时目标时间(以毫秒为单位),callback
参数指定了在倒计时结束后要执行的回调函数。
start()
方法启动倒计时,stop()
方法停止倒计时。
tick()
方法是倒计时的核心逻辑。它计算从倒计时开始到现在所经过的时间(elapsedTime
),以及从上一次执行 tick()
方法到现在所经过的时间(expectedElapsedTime
)。然后,它计算出定时器的执行时间与实际时间的差异(drift
),并根据差异调整定时器的执行时间(adjustedInterval
)。最后,它检查倒计时是否已经结束,如果是,则停止倒计时并执行回调函数;如果不是,则继续运行定时器。
通过这种方式,我们可以让 JavaScript 前端倒计时即使在长时间运行后也能保持准确性。