有没有办法清除给定窗口中的所有超时?我想超时存储在window
对象的某个地方,但无法确认。
欢迎任何跨浏览器解决方案。
有没有办法清除给定窗口中的所有超时?我想超时存储在window
对象的某个地方,但无法确认。
欢迎任何跨浏览器解决方案。
它们不在 window 对象中,但它们有 id,它们(afaik)是连续的整数。
所以你可以像这样清除所有超时:
var id = window.setTimeout(function() {}, 0);
while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present
}
我认为实现这一点的最简单方法是将所有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]);
}
我对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);
};
});
然后清除所有可能由外部代码设置的所有挂起超时你想要的次数
如何将超时 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);