2009-12-13 15 views
23

Estoy creando una sección de comentarios refrescantes automáticos para mi sitio web usando jQuery .load. Así que estoy usando un temporizador javascript 'setTimeout' para buscar nuevos comentarios.¿Hay alguna manera de borrar todos los temporizadores de JavaScript a la vez?

Pero después de hacer algunas cosas como cambiar páginas de comentarios o eliminar (todas usando ajax), algunos cronómetros siguen funcionando, aunque utilicé clearTimeout antes de cargar contenido ajax nuevo.

¿Hay alguna forma de borrar TODOS los temporizadores de JavaScript cuando cargue nuevo contenido ajax?

Respuesta

23

No existe una función general en javascript que le permita borrar todos los temporizadores. Deberá realizar un seguimiento de todos los temporizadores que cree. Para ello se puede utilizar una matriz global:

var timers = []; 
... 
// add a timer to the array 
timers.push(setTimeout(someFunc, 1000)); 
... 
// clear all timers in the array 
for (var i = 0; i < timers.length; i++) 
{ 
    clearTimeout(timers[i]); 
} 
+0

El problema es que mi contenido ajax cargado más recientemente no tiene control sobre los temporizadores anteriores. – Jens

+0

Es por eso que sugerí una variable global. –

+0

gracias, para mí también tu respuesta ayudó – beginner

2

En su lugar, puede considerar el uso de jQuery Timers, que abstrae muchos de los detalles "feos" de setTimeout/setInterval, y hace que sean más fáciles de usar en su código para cosas como lo que está describiendo.

+2

Enlace fuera de fecha – Benubird

+0

@Benubird - Por desgracia esto es la más reciente que puedo encontrar. Si tiene uno más nuevo, hágamelo saber ... –

+0

Sí, parece que no hay una versión actual (http://stackoverflow.com/questions/3674566/where-can-i-download-jquery-timers), podría no ser utilizable más. – Benubird

39

Advertencia: Mi código de abajo es problemático, sobre todo porque el requisito es de por sí es problemático. Me pregunto por qué querrías borrar todos los temporizadores de cualquier forma. Esto hace que tu código rompa cualquier complemento que use los temporizadores. Lo cual es mucho más común de lo que piensas, a menos que, por supuesto, estés depurando o divirtiéndote, entonces no importa.


Si usted tiene que:

Ésta es una de las peores soluciones posibles. Sin embargo, revela una posible vulnerabilidad de seguridad en JavaScript. Pero ya que simplemente funciona (borra todos los contadores de tiempo) pensé que estaría bien compartirlo:

var maxId = setTimeout(function(){}, 0); 

for(var i=0; i < maxId; i+=1) { 
    clearTimeout(i); 
} 
+4

Si bien la respuesta aceptada es una buena práctica genial, responde a la pregunta planteada en el título. –

+0

¡Buena idea, gracias! – HATCHA

+0

¡Esta es una gran solución! Supongo que es un navegador cruzado de todos modos? – 0xC0DEGURU

Cuestiones relacionadas