javascript:清除所有超时?

IT技术 javascript timeout
2021-01-16 19:20:37

有没有办法清除给定窗口中的所有超时?我想超时存储在window对象的某个地方,但无法确认。

欢迎任何跨浏览器解决方案。

6个回答

它们不在 window 对象中,但它们有 id,它们(afaik)是连续的整数。

所以你可以像这样清除所有超时:

var id = window.setTimeout(function() {}, 0);

while (id--) {
    window.clearTimeout(id); // will do nothing if no timeout with id is present
}
这不是无限循环吗?并非所有浏览器都将 if(0) 呈现为 false。
2021-03-22 19:20:37
由于我询问了如何清除所有超时,因此我接受了这个答案。非常聪明的解决方案。
2021-03-23 19:20:37
它不需要从 1 开始。HTML5规范说“让句柄是一个用户代理定义的大于零的整数,它将标识此调用设置的超时时间。” 这为句柄为任何正整数留下了空间,包括非连续和非小整数。
2021-03-26 19:20:37
这是规范的一部分,还是依赖于实现?
2021-04-04 19:20:37
这非常聪明,但 OP 可能应该询问是否有更好的解决方案来跟踪活动计时器。
2021-04-07 19:20:37

我认为实现这一点的最简单方法是将所有setTimeout标识符存储在一个数组中,您可以在其中轻松迭代所有标识符clearTimeout()

var timeouts = [];
timeouts.push(setTimeout(function(){alert(1);}, 200));
timeouts.push(setTimeout(function(){alert(2);}, 300));
timeouts.push(setTimeout(function(){alert(3);}, 400));

for (var i=0; i<timeouts.length; i++) {
  clearTimeout(timeouts[i]);
}
+1,不会清除所有超时,但是一次清除特定超时组的好方法
2021-03-19 19:20:37
也许当我进入一个我无法控制的网页时,我想清除所有超时和间隔,因为它们有一个烦人的弹出广告,直到我的广告拦截器运行后才会开始。
2021-03-30 19:20:37
@marcioAlmada 奇怪,但很高兴看到你在 2.5 年后再次对此发表评论:)
2021-04-02 19:20:37
这是最好的解决方案,因为它不会破坏外部代码,但是由于我询问了如何清除所有超时,我最终接受了 @Pumbaa80 答案:)
2021-04-03 19:20:37
这具有仅清除设置的那些的好处(或潜在的缺点,我猜),因此您不会无意中破坏外部代码。
2021-04-05 19:20:37

我对Pumbaa80 的回答有一个补充,可能对为旧 IE 开发的人有用。

是的,所有主要浏览器都将超时 ID 实现为连续整数(规范不需要)。整个浏览器的起始编号不同。似乎 Opera、Safari、Chrome 和 IE > 8 从 1 开始超时 ID,基于 Gecko 的浏览器从 2 和 IE <= 8 从一些随机数开始,这些随机数在选项卡刷新时神奇地保存。你可以自己去发现

所有这一切都意味着在 IE <=8 中,while (lastTimeoutId--)循环可能会运行超过8 位数字并显示“此页面上的脚本导致 Internet Explorer 运行缓慢”消息。因此,如果您无法保存所有超时 ID或不想覆盖 window.setTimeout,您可以考虑在页面上保存第一个超时 ID 并清除超时直到它。

在早期页面加载时执行代码:

var clearAllTimeouts = (function () {
    var noop = function () {},
        firstId = window.setTimeout(noop, 0);
    return function () {
        var lastId = window.setTimeout(noop, 0);
        console.log('Removing', lastId - firstId, 'timeout handlers');
        while (firstId != lastId)
            window.clearTimeout(++firstId);
    };
});

然后清除所有可能由外部代码设置的所有挂起超时你想要的次数

加上一个用于澄清一些更详细的信息。
2021-04-03 19:20:37

如何将超时 id 存储在全局数组中,并定义一个方法将函数调用委托给窗口。

GLOBAL={
    timeouts : [],//global timeout id arrays
    setTimeout : function(code,number){
        this.timeouts.push(setTimeout(code,number));
    },
    clearAllTimeout :function(){
        for (var i=0; i<this.timeouts.length; i++) {
            window.clearTimeout(this.timeouts[i]); // clear all the timeouts
        }
        this.timeouts= [];//empty the id array
    }
};

这已经很晚了……但是:

基本上,setTimeout/setInterval ID 的顺序是连续的,所以只需创建一个虚拟超时函数来获取最高 ID,然后清除所有低于该 ID 的时间间隔。

const highestId = window.setTimeout(() => {
  for (let i = highestId; i >= 0; i--) {
    window.clearInterval(i);
  }
}, 0);
不错的解决方案,但请注意,与其他一些答案不同,这不会立即清除超时;它将等到下一个事件循环。
2021-03-15 19:20:37
任何一个都有效,因为它们基本上做同样的事情
2021-03-17 19:20:37
这对我来说是最好的解决方案!!谢谢你查里
2021-03-21 19:20:37
优秀的!这正是我正在寻找的。+1
2021-03-28 19:20:37
在 for 循环中,clearInterval 还是 clearTimeout?
2021-04-01 19:20:37