取消所有Javascript setTimeout和setInterval

时间:2012-07-07 10:17:26

标签: javascript jquery animation

在给定的秒数后取消所有JS setTimeout,setInterval和requestAnimationFrame的正确方法是什么?

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

2 个答案:

答案 0 :(得分:14)

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

一种狡猾的ha / /蛮力方式就是这样:

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:

如果你没有为每次超时等保留一个参考,我不相信有比蛮力方式更好的方法,所以要更容易做到这一点(正如{{3}所建议的那样}),您可以覆盖默认的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上以相同的方式完成。

答案 1 :(得分:1)

您需要获取对每个超时的引用(setTimeout的返回值),然后使用clearTimeout(),然后您希望取消它们。对于setInterval也一样。