取消所有 Javascript 的 setTimeouts 和 setIntervals

Cancel all Javascript's setTimeouts and setIntervals

本文关键字:setTimeouts setIntervals Javascript 取消      更新时间:2023-09-26

给定的秒数后取消所有JS设置超时,setInterval和requestAnimationFrame的正确方法是什么?

编辑:对不起,我应该解释更多!代码来自数据库或某些API,因此我无法跟踪超时,raf或间隔ID。所以我没有计时器的ID,我可以很容易地清除间隔或清除超时或取消动画帧。我知道我必须使用它们,但我不知道如何获取所有动画 ID(如果有的话)。

你需要保留你创建的每个间隔、超时和requestAnimationFrame的ID,并调用window.clearInterval(id)等。

一种非常黑客/蛮力的方式来做到这一点是这样的:

for (var i = 1; i < 99999; i++) {
    window.clearInterval(i);
    window.clearTimeout(i);
    window.mozCancelAnimationFrame(i); // Firefox
}

但我不建议这样做。

更新:

要在一定时间后执行此操作:

setTimeout(function () {
   for (var i = 1; i < 99999; i++) {
        window.clearInterval(i);
        window.clearTimeout(i);
        window.mozCancelAnimationFrame(i); // Firefox
    }
}, 3000); // After 3 seconds

更新 2:

如果您不为每个超时等保留引用,我不相信有比蛮力方式更好的方法,因此为了使它更容易做到这一点(如此 SO 答案所建议的那样),您可以覆盖默认的 setInterval:

var intervals = new Array();
window.oldSetInterval = window.setInterval;
window.setInterval = function(func, interval) {
    intervals.push(oldSetInterval(func, interval));
}
// Now you can loop over intervals and clear them 
// one by one when ever you want to.
for (var interval in intervals) {
   window.clearInterval(interval);
}

该示例显示了如何为setInterval执行此操作,但当然也可以在setTimeoutrequestAnimationFrame上以相同的方式完成。

您需要

获取对每个超时的引用(返回值 setTimeout ),然后使用 clearTimeout() 然后您希望取消它们。对于设置间隔相同。