【问题标题】:Cancel all Javascript's setTimeouts and setIntervals取消所有 Javascript setTimeout 和 setInterval
【发布时间】:2012-07-07 18:31:29
【问题描述】:

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

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

【问题讨论】:

  • 在这种情况下,无法取消它们。您唯一可以做的另一件事是覆盖它们引用的函数,前提是已经为 setTimeout 调用提供了命名函数引用。用新的空函数覆盖每个引用的函数,超时发生时不会发生任何事情。
  • 在我链接到上述评论的帖子中,有一个答案重新定义了setIntervalsetTimeout 方法并自动将它们注册到全局列表中,然后用于清除所有其中。对于您的目的,这可能非常有趣。

标签: javascript jquery animation


【解决方案1】:

您需要保留您创建的每个间隔、超时和 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 执行此操作,但当然也可以在setTimeoutrequestAnimationFrame 上执行此操作。

【讨论】:

  • 确实,我觉得这是一种非常黑客的方式。很想知道更好的方法。
  • @user1437328 为什么不能存储所有的id?恐怕没有更好的方法,不保留对每个超时等的引用。
  • 您的更新编号 2 非常聪明。你从一个骇人听闻的解决方案变成了一个优化的解决方案。谢谢!
  • 这在您无法访问原始代码时非常有用,例如在自动加载 jquery 代码中:$(function(){ setInterval(function(){ /** ... **/ }, 10); }); 我还没有找到另一种获取间隔实例的方法:(跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多