清除所有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)