7

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

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

4

2 回答 2

14

您需要保留您创建的每个间隔、超时和 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:

如果您不为每次超时等保留参考,我不相信有比蛮力方式更好的方法,所以为了更容易做到这一点(如this SO answer所建议),您可以覆盖默认的 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,但当然也可以以相同的方式setTimeout完成requestAnimationFrame

于 2012-07-07T10:20:46.697 回答
1

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

于 2012-07-07T10:22:57.600 回答