web-dev-qa-db-ja.com

すべてのsetIntervalをクリアします

私はeach()関数内でsetIntervalsを次のように使用しています

_$(".elements").each(function() {
    setInterval(function() {

    }, 1000);
});
_

明らかに、setIntervalsは要素ごとに作成されます。

私の質問は、setIntervalsが不要になったときに、すべてのsetIntervalsをクリアするにはどうすればよいですか? setIntervalを変数に格納して、window.clearInterval(int)を呼び出しようとしましたが、各変数がオーバーライドされるため、最後のsetIntervalのみがクリアされます。

7
user3758078

間隔を設定すると、その間隔へのポインタが表示されます。

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

間隔をキャンセルする場合は、次のようにします。

clearInterval(myInterval); 

したがって、やりたいことについては、次のようにします。

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

    }, 1000);
    intervals.Push(i);
});

次に、それらをすべてキャンセルする必要がある場合は、これを行うことができます。

intervals.forEach(clearInterval);

それはあなたのためにそれをするはずです。

16
frosty

「すべての間隔をクリアする」機能はありません。

それらをすべて保存し、すべてクリアする必要があります。

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
2
Paul Roub
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 にするか、同等のライブラリまたはプレーンループに置き換える必要があります。

1
Paul

各間隔は要素に関連付けられているため、間隔IDを要素に格納できます。

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

次に、間隔をクリアしたい場合は、

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

このソリューションを使用することはお勧めしませんが、実際にうまくいきます。 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)
0
Dmitry