在给定的秒数后取消所有JS setTimeout,setInterval和requestAnimationFrame的正确方法是什么?
编辑:对不起,我应该解释更多!代码来自数据库或某些API,因此我无法跟踪超时,raf或间隔ID。所以我没有定时器的ID,我可以很容易地将你清除为interInterval或clearTimeout或cancelAnimationFrame。我知道我必须使用它们,但我不知道如何获取所有动画ID(如果有的话)。
答案 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
执行此操作,但当然也可以在setTimeout
和requestAnimationFrame
上以相同的方式完成。
答案 1 :(得分:1)
您需要获取对每个超时的引用(setTimeout
的返回值),然后使用clearTimeout()
,然后您希望取消它们。对于setInterval也一样。