清除所有setIntervals

我在each()函数中使用setIntervals ,就像这样

 $(".elements").each(function() { setInterval(function() { }, 1000); }); 

显然,为每个元素创建了一个setIntervals。

我的问题是:当我不再需要它时,如何清除所有setIntervals? 我已经尝试将setInterval存储在一个变量中并调用window.clearInterval(int) ,但这只会清除最后一个setInterval,因为每个变量都被覆盖了。

设置间隔时,会得到一个指向它的指针:

 var myInterval = setInterval(function(){}, 4000); 

如果要取消间隔,请执行以下操作:

 clearInterval(myInterval); 

因此,对于您想要做的事情,您将执行以下操作:

 var intervals = []; $(".elements").each(function() { var i = setInterval(function() { }, 1000); intervals.push(i); }); 

然后,如果你需要取消它们,你可以这样做:

 intervals.forEach(clearInterval); 

那应该为你做。

没有“清除所有间隔”function。

你需要存储所有这些,并清除所有这些:

 var ints = []; $(".elements").each(function() { ints.push( setInterval(function() { }, 1000) ); }); // later for ( var i = 0; i < ints.length; ++i ) clearInterval( ints[i] ); ints = []; // and forget them 
 var clearAllIntervals = function ( ) { var intervals = []; $(".elements").each(function() { intervals.push( setInterval(function() { }, 1000) ); }); return function clearAll ( ) { intervals.forEach( clearInterval ); } }( ); // When you want to clear them: clearAllIntervals( ); 

如果您想要与IE8兼容,或者您​​应该使用shim .forEach ,或者用等效的库或普通循环替换它。

由于每个间隔都与一个元素相关联,因此您可以将间隔ID存储在元素中:

 $(".elements").each(function() { $(this).data('interval-id', setInterval(function() { // ... }, 1000)); }); 

然后,如果你想清除间隔,

 $(".elements").each(function() { clearInterval($(this).data('interval-id')); }); 

我不建议您使用此解决方案,但它确实可以解决问题。 它想要覆盖setInterval函数来收集setInterval的所有链接:

 (function(originalSetInterval){ var intervals = []; window.setInterval = function(func, timeout) { var newInterval = originalSetInterval(func, timeout); intervals.push(newInterval); return newInterval; } window.clearAllIntervals = function() { intervals.forEach(clearInterval); } })(window.setInterval) 

为了做得更好,您还需要覆盖clearInterval以删除已经清除的所有间隔:

 (function(originalSetInterval, originalClearInterval){ var intervals = []; window.setInterval = function(func, timeout) { var newInterval = originalSetInterval(func, timeout); intervals.push(newInterval); return newInterval; } window.clearInterval = function(interval) { originalClearInterval(interval); intervals.splice(intervals.indexOf(interval), 1) } window.clearAllIntervals = function() { intervals.forEach(clearInterval); } })(window.setInterval, window.clearInterval)