私はeach()
関数内でsetIntervals
を次のように使用しています
_$(".elements").each(function() {
setInterval(function() {
}, 1000);
});
_
明らかに、setIntervalsは要素ごとに作成されます。
私の質問は、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);
それはあなたのためにそれをするはずです。
「すべての間隔をクリアする」機能はありません。
それらをすべて保存し、すべてクリアする必要があります。
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)