web-dev-qa-db-fra.com

Comment puis-je clearInterval () pour tous les setInterval ()?

J'ai un setInterval () appelé dans un plugin jQuery, mais je veux l'effacer de ma page principale, où je n'ai pas accès à la variable dans laquelle setInterval était stocké.

Existe-t-il un moyen d'effacer toutes les minuteries présentes sur une page?

36
Matt

Cela peut être une logique pour effacer tous les intervalles ...

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

Vous pouvez remplacer 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.
}
22
Isaac Waller

Non, vous ne pouvez pas, pas sans la variable d'origine.

8
Sasha Chedygov

La réponse

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

était celui que je cherchais. Avec un peu d'amélioration de cette logique très simple, j'ai été capable de faire quelque chose comme ça.

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]);                      
    }                       
}
4
Marcus Ford

Pour ce faire, j'ai créé un tableau au niveau de l'application (par exemple, Application.setIntervalIds = []) auquel je renvoie les identifiants setInterval à chaque création. Ensuite, je peux simplement appeler window.clearInterval (id) sur chaque identifiant du tableau lorsque j'en ai besoin.

Par exemple, lorsque je crée un nouveau setInterval, j'écris quelque chose comme (coffeescript):

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

Et puis j'ai une fonction clearAllSetIntervals que je peux appeler en cas de besoin:

Application.clearAllSetIntervals = () ->
    $.each Application.setIntervalIds, (index, id) ->
         window.clearInterval id
2
ProfNimrod

Le meilleur moyen que j'ai trouvé ...

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( );
1
Ashwini Jindal

Je stocke chaque ID d'intervalle dans un conteneur caché, puis j'appelle cette fonction pour effectuer une boucle et supprimer chaque ID avec 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');
}

C'est moche mais pour mes besoins cela fonctionne.

0

Cela a fonctionné pour moi.

//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
Salman Ullah Khan