如何使用javascript停止所有超时和间隔?

IT技术 javascript
2021-02-12 08:12:45

我正在开发一个包含许多运行超时和间隔的 ajax web 应用程序。现在我有时需要清除所有运行超时和间隔。有没有一种简单的方法可以停止一切而无需存储每个超时和间隔 ID 并遍历它们并清除它们?

6个回答

有时可以保存计时器 Id / 句柄以在以后清除它,这将是最好的解决方案。所以这是第二好的。但我想更好地了解正在发生的事情。它基本上会获取最高的计时器 ID,然后清除所有小于该 ID 的内容。但是也可以清除您不想清除的其他计时器!

这有点hackish,所以要小心!

// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
    clearTimeout(i); 
}
规范说返回的 id 只需要是一个非零值。它的连续性这一事实似乎没有权威来源的依据。所以只要“存在的权力”保持这种状态,这个黑客就会奏效
2021-03-22 08:12:45
可以做成书签--- javascript:var highmark=setTimeout(function(){while(highmark>0)clearTimeout(highmark--)})+100
2021-03-29 08:12:45
这段代码有助于杀死我正在尝试使用的网页上的所有计时器。我从控制台运行它。
2021-04-01 08:12:45
很酷,代码也会清除所有间隔。
2021-04-03 08:12:45
在 Chrome 上工作得很好,可以禁用使我失去阅读位置的烦人的重新加载。
2021-04-10 08:12:45

阅读重复后更新答案我关闭了这个问题 -

它在 OSX 上的 Chrome 中运行和测试

// run something
var id1 = setInterval(function() { console.log("interval", new Date())}, 1000);
var id2 = setTimeout(function()  { console.log("timeout 1", new Date())}, 2000);
var id3 = setTimeout(function()  { console.log("timeout 2", new Date())}, 5000); // not run
          setTimeout(function()  { console.log("timeout 3", new Date())}, 6000); // not run

// this will kill all intervals and timeouts too in 3 seconds. 
// Change 3000 to anything larger than 10

var killId = setTimeout(function() {
  for (var i = killId; i > 0; i--) clearInterval(i)
}, 3000);

console.log(id1, id2, id3, killId); // the IDs set by the function I used

注意:查看具有 typeof 数字的窗口对象 - 有趣的是,IE 分配了一个 8 位数字,FF 分配了一个以 2 开头的单个数字

同意。也请注意日期。它已经很旧了。此外,我从来都不是面向对象的程序员。还要注意你想在 IE 中运行的 8 位数字
2021-03-18 08:12:45
试图找到具有数字类型的窗口对象 - 有趣的是,IE 分配了一个 8 位数字,FF 分配了一个以 2 开头的单个数字
2021-03-20 08:12:45
我认为包含间隔的窗口对象将是一个包含对象的数组,而 x 和 y 将是该数组中新对象的 id。但是间隔和超时 ID 通常以从 0 或 1 递增的顺序密集存储。有些可能开始更高。所以你会从 y 到 0 调用clearInterval()每个号码。我在对上述问题的评论中发布了该答案的链接。但是……您的“答案”不仅没有回答问题,而且还以一种奇怪的、倒退的方式进行讨论,没有显示出对对象和数组如何工作的思考。
2021-03-21 08:12:45
改为upvote。谢谢你。
2021-03-21 08:12:45
没问题,我认为你的标志很有帮助。
2021-04-13 08:12:45

这是一个解决方法。

window.timeoutList = new Array();
window.intervalList = new Array();

window.oldSetTimeout = window.setTimeout;
window.oldSetInterval = window.setInterval;
window.oldClearTimeout = window.clearTimeout;
window.oldClearInterval = window.clearInterval;

window.setTimeout = function(code, delay) {
    var retval = window.oldSetTimeout(code, delay);
    window.timeoutList.push(retval);
    return retval;
};
window.clearTimeout = function(id) {
    var ind = window.timeoutList.indexOf(id);
    if(ind >= 0) {
        window.timeoutList.splice(ind, 1);
    }
    var retval = window.oldClearTimeout(id);
    return retval;
};
window.setInterval = function(code, delay) {
    var retval = window.oldSetInterval(code, delay);
    window.intervalList.push(retval);
    return retval;
};
window.clearInterval = function(id) {
    var ind = window.intervalList.indexOf(id);
    if(ind >= 0) {
        window.intervalList.splice(ind, 1);
    }
    var retval = window.oldClearInterval(id);
    return retval;
};
window.clearAllTimeouts = function() {
    for(var i in window.timeoutList) {
        window.oldClearTimeout(window.timeoutList[i]);
    }
    window.timeoutList = new Array();
};
window.clearAllIntervals = function() {
    for(var i in window.intervalList) {
        window.oldClearInterval(window.intervalList[i]);
    }
    window.intervalList = new Array();
};

它适用于在执行这些行后调用的设置/清除超时/间隔函数。尝试看看它是否有效:

setInterval('console.log(\'a\')', 1000);
setInterval('console.log(\'b\')', 500);
setInterval('console.log(\'c\')', 750);
setTimeout('clearAllIntervals()', 10000);

代理有魔力。

加一。如果包含短语“猴子补丁”,我会更容易找到这个答案,所以它就是这样。
2021-03-16 08:12:45
好东西。我经常将它用于 document.write 和 alert
2021-03-24 08:12:45
var noofTimeOuts = setTimeout('');
for (var i = 0 ; i < noofTimeOuts ; i++) clearTimeout(i);
我不确定,但这在 chrome 上对我不起作用
2021-03-26 08:12:45
使用function(){}代替""Chrome 工作。
2021-03-31 08:12:45
var max = setTimeout(function(){ /* Empty function */ },1);

        for (var i = 1; i <= max ; i++) {
            window.clearInterval(i);
            window.clearTimeout(i);
            if(window.mozCancelAnimationFrame)window.mozCancelAnimationFrame(i); // Firefox
        }
它正在工作,但我不得不问,为什么是 99999?我可以使用更高的值吗?
2021-03-28 08:12:45
是的,您可以获得最大 id : var max = setTimeout(()=>{},1) for (var i = 1; i <= max ; i++) { window.clearInterval(i); window.clearTimeout(i); if(window.mozCancelAnimationFrame) window.mozCancelAnimationFrame(i); // 火狐 }
2021-04-06 08:12:45