2011-12-26 23 views
27

estoy usando¿Cómo elimino todos los intervalos?

varName = setInterval(function() { ... }, 1000); 

para fijar un par de intervalos en un plugin de jQuery que estoy escribiendo, pero cuando se vuelve a cargar el plugin necesito aclarar esos intervalos. He intentado que el almacenamiento de las variables, así:

(function($){ 
$.mosaicSlider = function(el) { 
    var base = this;   
    var transitionInterval, mainInterval; 

... 

base.init = function() { 
    mainInterval = setInverval(function() { ... }, 1000); 
} 

base.grid = function() { 
    this.transition() = function() { 
     transitionInterval = setInterval(function(...) { 
    } 
} 

base.init(); 

Y intentado matar a esos intervalos en el base.init() la función, así:

clearInterval(transitionInterval); 
clearInterval(mainInterval); 

Y como esto:

window.oldSetInterval = window.setInterval; 
window.setInterval = new function(func, interval) { } 
+0

intentar añadir 'transitionInterval var, mainInterval;.' De '' función mosaicSlider' después (function ($) { ' –

+2

posible duplicado de [How to clearInterval with unknown ID?] (http://stackoverflow.com/questions/6843201/how-to-clearinterval-with-unknown-id) –

+0

Posible duplicado de [Cómo detener todos los tiempos de espera e intervalos usando javascript ?]] (http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript) –

Respuesta

36

Se podría hacer, como,

var interval_id = window.setInterval("", 9999); // Get a reference to the last 
               // interval +1 
for (var i = 1; i < interval_id; i++) 
     window.clearInterval(i); 
//for clearing all intervals 
+0

Este fragmento SÍ funcionó, pero causa algunos efectos secundarios extraños. Aquí está el plugin: http://www.nikolaydyankov.com/Dev/mosaic - intente jugar con la configuración a continuación y vea cómo las transiciones simplemente dejan de funcionar. Intenté depurar esto, registré todas las variables, probé todos los intervalos nuevos y nada. Simplemente no funcionará. –

+9

Esto no es una buena idea. [La especificación] (http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#list-of-active-timeouts) no garantiza ningún orden específico para los identificadores, solo que son numéricos y únicos –

+0

La especificación establece "Let handle sea un entero definido por el agente de usuario que es mayor que cero que identificará el tiempo de espera que establecerá esta llamada". Es decir, positivo y único. Sin otras garantías –

47

Almacénelos en un objeto. Como usted es el único que hace estos intervalos, y usted sabe cuáles son, puede almacenarlos y luego meterlos con ellos como lo desee. Me gustaría crear un objeto dedicado para eso, algo como:

var interval = { 
    //to keep a reference to all the intervals 
    intervals : {}, 

    //create another interval 
    make : function (fun, delay) { 
     //see explanation after the code 
     var newInterval = setInterval.apply(
      window, 
      [ fun, delay ].concat([].slice.call(arguments, 2)) 
     ); 

     this.intervals[ newInterval ] = true; 

     return newInterval; 
    }, 

    //clear a single interval 
    clear : function (id) { 
     return clearInterval(this.intervals[id]); 
    }, 

    //clear all intervals 
    clearAll : function() { 
     var all = Object.keys(this.intervals), len = all.length; 

     while (len --> 0) { 
      clearInterval(all.shift()); 
     } 
    } 
}; 

Su primera pregunta podría ser

¿Por qué hacer un objeto separado para eso?

Bueno Watson, es para mantener sus intervalos hechos a mano relacionados con su plugin/proyecto lejos de miradas indiscretas, por lo que no se metan con otros intervalos que se encuentra en la página no relacionada con su complemento.

Sí, pero ¿por qué no puedo almacenarlo dentro del objeto base?

Sin duda puede hacerlo, pero creo que de esta manera es mucho más limpio. Separa la lógica que haces en tu base con la extraña lógica de tiempo de espera.

"¿Por qué almacenaste los intervalos dentro de un objeto y no en una matriz?"

Acceso más rápido y un poco de código más limpio. Puedes ir de cualquier manera, en serio.

¿Qué es esto .apply y todas estas cositas matriz extraños en el interior de hacer?"

setInterval también acepta una lista de argumentos que se pasan a la función. Function.prototype.apply está más allá del alcance de esta pregunta, pero here's un semi-explicación para ello.

Estás haciendo trampa! se utilizaron cuenta con ES5! no quiero eso, quiero compatibilidad ES3

Me tienes. Object.keys es de hecho ES5. Sin embargo, puede reemplazarlo fácilmente con un bucle for in, o si se siente súper aventurero (para una clarificación y un protocolo futuros, eso era sarcasmo), cuélguelo.

+0

Utilicé una matriz como una estructura de datos, pero de todos modos, este es el enfoque correcto. Uno puede incluso tener diferentes "envoltorios" de intervalo en caso de que no quiera matarlos a todos. ¡Buena respuesta! – benjaminz

4

Intialize Timer y configúrelo como objeto de ventana. Window.myInterval contendrá la ID del temporizador.

como window.myInterval=setInterval(function() { console.log('hi'); }, 1000);

Para borrar intervalo se puede escribir como

if(window.myInterval!=undefined&&window.myInterval!='undefined'){ 
window.clearInterval(window.myInterval); 
alert('Timer cleared with id'+window.myInterval); 
} 
Cuestiones relacionadas