在给定的秒数后取消所有 JS setTimeout、setInterval 和 requestAnimationFrame 的正确方法是什么?
编辑:对不起,我应该解释更多!该代码来自数据库或某些 API,因此我无法跟踪超时、raf 或间隔 ID。所以我没有定时器的ID,我可以很容易地让你清除Interval 或clearTimeout 或cancelAnimationFrame。我知道我必须使用它们,但我不知道如何获取所有动画 ID(如果有的话)。
在给定的秒数后取消所有 JS setTimeout、setInterval 和 requestAnimationFrame 的正确方法是什么?
编辑:对不起,我应该解释更多!该代码来自数据库或某些 API,因此我无法跟踪超时、raf 或间隔 ID。所以我没有定时器的ID,我可以很容易地让你清除Interval 或clearTimeout 或cancelAnimationFrame。我知道我必须使用它们,但我不知道如何获取所有动画 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:
如果您不为每次超时等保留参考,我不相信有比蛮力方式更好的方法,所以为了更容易做到这一点(如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
。
您需要获取对每个超时的引用(的返回值setTimeout
),然后使用clearTimeout()
您希望取消它们。与 setInterval 相同。