取消所有Javascript的setTimeouts和setIntervals

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

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

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

一个强有力的hackish /蛮力方式来做到这一点将是这样的:

 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()然后您希望取消它们。 setInterval也是一样。