2010-10-02 20 views

Respuesta

89

Cuando llame al setTimeout(), almacene el ID del temporizador para que pueda borrarlo. Si está creando muchos tiempos de espera, una matriz es una buena opción para almacenar los ID. Por ejemplo:

var timeouts = []; 
//then, store when you create them 
timeouts.push(setTimeout({ ... }, 1000)); 

Entonces, cuando usted quiere limpiar ellos:

for (var i = 0; i < timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 
//quick reset of the timer array you just cleared 
timeouts = []; 

Como @Robert se señala más adelante, clearTimeout() no generará un error si ya ha tenido el tiempo de espera, por lo que no hay raza/problemas de tiempo aquí.

+3

También digno de mención, 'clearTimeout()' no a través de una excepción si se pasa un ID no válido (si el tiempo de espera ya ocurrió) . – Robert

+0

@Robert - Buen punto, tiendo a dar esto por hecho, pero lo agregaré, en caso de que haya alguna preocupación al respecto :) –

+0

Me gustaría pensar que con el modelo de un solo subproceso javascript que: En todos los casos Una vez que ClearTimeout haya finalizado, hay una garantía de que el evento de tiempo de espera no volverá a suceder. No está en los documentos, ¿no hace falta decirlo? – jcalfee314

4

No estoy seguro si puede hacerlo a nivel mundial, pero el método más común es usar clearTimeout. Usted pasa el valor de retorno de setTimeout() a clearTimeout(), puede usar una var global para almacenar todos los vars de timeout.

92

Si no puede obtener acceso al código donde está configurado el temporizador, es posible que la respuesta de Nick no funcione, por lo que todo lo que puedo pensar es sobre este truco.

¡Es un truco, úselo con precaución!

// Set a fake timeout to get the highest timeout id 
var highestTimeoutId = setTimeout(";"); 
for (var i = 0 ; i < highestTimeoutId ; i++) { 
    clearTimeout(i); 
} 

Básicamente se agarra la más alta Identificación del temporizador y borra todo menos de eso. ¡Pero también es posible eliminar otros temporizadores que no desea borrar!

+0

Gracias a Vaidotas, actualicé mi función de tiempo de espera configurada para ser más amigable con el navegador – SeanDowney

+12

+1 ¡este es un fragmento muy útil para pegar en la consola Javascript para desactivar todos los tiempos de espera! –

+2

Este truco causa errores difíciles de atrapar porque si una biblioteca de terceros utiliza setTimout y setInterval para la inicialización, esa biblioteca dejaría de funcionar sin ningún motivo, como acabo de descubrir. – user2191332

3

En primer lugar, yo estaba usando este código:

var x = setTimeout(''); 
for (var i = 0; i < x; i++) 
    clearTimeout(x); 

Sin embargo, esta paz de código no funciona en Google Chrome. Así que hice mejora para esto:

var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared 
for (var i = 0; i <= x; i++) 
    clearTimeout(i); 

Por último, se trata de un corte, como se mencionó en el comentario anterior, a fin de utilizarlo con cuidado.

Editar: fija variable de mal utilizado en bucle (uso i en lugar de x)

Cuestiones relacionadas