有没有办法清除给定窗口中的所有超时?我认为超时存储在window
对象中的某个地方,但无法确认。
欢迎任何跨浏览器的解决方案。
发布于 2012-01-14 12:43:36
它们不在窗口对象中,但它们具有in,in (afaik)是连续的整数。
因此,您可以像这样清除所有超时:
var id = window.setTimeout(function() {}, 0);
while (id--) {
window.clearTimeout(id); // will do nothing if no timeout with id is present
}
发布于 2012-01-14 12:45:12
我认为实现这一点的最简单方法是将所有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]);
}
发布于 2013-05-08 19:55:27
我有一个对Pumbaa80's answer的补充,可能对为旧IE开发的人有用。
是的,所有主流浏览器都将超时is实现为连续整数(即not required by specification)。尽管不同浏览器的起始号是不同的。似乎Opera,Safari,Chrome和IE >8从1开始超时It,基于壁虎的浏览器从2开始,IE <= 8从某个随机数字开始,这些数字在选项卡刷新时被神奇地保存下来。你可以使用discover it yourself。
所有这些都意味着在IE <=8中,while (lastTimeoutId--)
周期可能会运行超过8位数的时间,并显示“此页上的脚本正在导致Internet Explorer运行缓慢”的消息。因此,如果你不能超时或者不想超时,你可以考虑把第一个save all you timeout id's 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);
};
});
然后清除所有挂起的超时,这些超时可能由外部代码多次设置
https://stackoverflow.com/questions/8860188
复制相似问题