Как я могу очиститьInterval () для всех setInterval ()? - PullRequest
36 голосов
/ 06 июня 2009

У меня есть setInterval (), вызываемый в плагине jQuery, но я хочу удалить его с моей главной страницы, где у меня нет доступа к переменной, в которой хранится setInterval.

Есть ли способ очистить все таймеры, присутствующие на странице?

Ответы [ 8 ]

51 голосов
/ 21 августа 2011

Это может быть логика для очистки всех интервалов ...

for (var i = 1; i < 99999; i++)
        window.clearInterval(i);
23 голосов
/ 06 июня 2009

Вы можете переопределить setInterval:

window.oldSetInterval = window.setInterval;
window.setInterval = function(func, interval) {
    var interval = oldSetInterval(func, interval);
    // store it in a array for stopping? stop it now? the power is yours.
}
8 голосов
/ 06 июня 2009

Нет, вы не можете, не без исходной переменной.

4 голосов
/ 09 ноября 2013

Ответ

for (var i = 1; i < 99999; i++)
     window.clearInterval(i);

был тем, кого я искал. С небольшим улучшением этой очень простой логики я смог сделать что-то вроде этого.

var i = 0;
var rotatorId;
var rotator;

rotator =  setInterval(function() {myfunction(), 3000});
rotatorId[i] = rotator;
i++;

if (rotator > 1) {
   for(i = 1; i < rotatorId.length; i++){
      clearInterval(rotatorId[i]);                      
    }                       
}
2 голосов
/ 21 августа 2013

Способ, которым я достиг этого, заключается в наличии массива уровня приложения (например, Application.setIntervalIds = []), в который я помещаю идентификаторы setInterval при каждом создании. Затем я могу просто вызвать window.clearInterval (id) для каждого идентификатора в массиве, когда мне нужно.

Например, когда я создаю новый setInterval, я пишу что-то вроде (coffeescript):

id = setInterval (() -> function2call()), timeout
Application.setIntervalIds.push id

А затем у меня есть функция clearAllSetIntervals, которую я могу вызвать при необходимости:

Application.clearAllSetIntervals = () ->
    $.each Application.setIntervalIds, (index, id) ->
         window.clearInterval id
1 голос
/ 18 мая 2017

Лучший способ, который я нашел ...

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( );
0 голосов
/ 20 апреля 2018

Это сработало для меня.

//Setting interval
var startInterval = setInterval(function () {
 //interval code here
}, 1000);

//Clearing interval
var countInterval = startInterval != undefined ? startInterval : 0;

 for (var a = 0; a < countInterval; a++) {
  clearInterval(a);
 }
0 голосов
/ 16 февраля 2018

Я сохраняю каждый идентификатор интервала в скрытом контейнере, затем вызываю эту функцию, чтобы выполнить цикл и удалить каждый идентификатор с помощью window.clearInterval ..

function clearAllIntervals() {
    $('.intervals-holder span').each(function() {
        var clearThis = parseInt($(this).text(), 10); // gets the interval id from the span holder
        window.clearInterval(clearThis); // removes the interval
        $(this).remove(); // removes the span holding the id
    })
}

// setting interval
// (i clear all first because in my code the buttons can be double clicked..
// ..and there is more than one button to start what i want to be started)
function audioRingingInterval() {
    clearAllIntervals();
    var intervalId = setInterval(audioRingingStartFunction, 500);
    $('.intervals-holder').append('<span>'+intervalId+'</span>');
}
// i call this when i want to set the interval and it calls the interval function above
function audioRingingStartFunction() {
    $('.audio-blinking').toggleClass('blinking');
}
// i call this when i want to stop the interval
function audioRingingStopFunction() {
    clearAllIntervals();
    $('.audio-blinking').removeClass('blinking');
}

Это ужасно, но для моих целей это работает.

...