img attribute javascript timer setinterval clearinterval

javascript - attribute - ¿Cómo borrar el intervalo con una identificación desconocida?



title html css (4)

Bueno, las pruebas empíricas en Chrome muestran que setInterval devuelve un número que se incrementa para cada llamada. Entonces, si está SEGURO de que setInterval fue el último conjunto, funcionaría lo siguiente:

function clearLastInterval () { var i = setInterval (function () {}, 10000); clearInterval (i-1); clearInterval (i); }

No estoy seguro de recomendar esto, aunque ;-)

Digamos que alguien (malvado) nos ha configurado un temporizador con setInterval , pero no sabemos su ID (no tenemos la referencia al objeto, ese setInterval está regresando, ni su valor)

(function(){ setInterval(function(){console.log(''pwned'')}, 10000) })();

¿Hay alguna manera, cómo limpiarlo? ¿Es posible acceder al temporizador de otra manera? ¿O al menos en particular el navegador / motor javascript?

David Flanagan toca un tema similar a su gran JSTDG. setInterval() method, use in malicious code clave de setInterval() method, use in malicious code en los puntos de índice para

... Algunos navegadores detectan cuadros de diálogo repetidos y secuencias de comandos de larga ejecución y le dan al usuario la opción de detenerlos. Pero el código malicioso puede usar métodos como setInterval () para cargar la CPU y también puede atacar su sistema asignando mucha memoria. No hay una forma general en que los navegadores web puedan evitar este tipo de ataques con mano de obra. En la práctica, este no es un problema común en la Web, ¡ya que nadie regresa a un sitio que se involucra en este tipo de abuso de scripting!


Desde la prueba rápida, todos los principales navegadores (los más recientes de Chrome, Firefox e IE) proporcionan números muy pequeños como ID, por lo que el bucle "a ciegas" sobre todos los números posibles debería funcionar bien:

function ClearAllIntervals() { for (var i = 1; i < 99999; i++) window.clearInterval(i); }

Ejemplo completo:

window.onload = function() { window.setInterval(function() { document.getElementById("Tick").innerHTML += "tick<br />"; }, 1000); window.setInterval(function() { document.getElementById("Tack").innerHTML += "tack<br />"; }, 1000); }; function ClearAllIntervals() { for (var i = 1; i < 99999; i++) window.clearInterval(i); }

#Placeholder div { width: 80px; float: left; }

<button type="button" onclick="ClearAllIntervals();">Clear All</button> <div id="Placeholder"> <div id="Tick"></div> <div id="Tack"></div> </div>

Esto detendrá todos los intervalos, no puede detener un intervalo específico sin conocer su ID, por supuesto.

Como puedes probar por ti mismo, debería funcionar en todos los principales navegadores mencionados anteriormente.


Lo resolví utilizando localstorage, guardando allí el id del setInterval, y recogiéndolo más tarde para borrar ese intervalo.


Probé el enfoque sugerido por el asistente de #Shadow y funcionó para borrar el intervalo. Sin embargo, este enfoque tuvo efectos secundarios después. En mi caso particular, no pude usar jquery.fadeTo () después de borrar todos los intervalos.

El enfoque que adopté es una solución más limpia, que consiste en redefinir el método setInterval y guardar los identificadores de intervalo en los métodos redefinidos. Como se muestra aquí, coloco los id en una matriz y luego los borro todos. Con un poco más de refinamiento de la estructura para almacenar los arreglos, puede etiquetarlos y borrarlos de forma selectiva.

var intervalTracking = new Array(); var intervalCount=0; window.oldSetInterval = window.setInterval; window.setInterval = ( function(func, interval) { var interval = oldSetInterval(func, interval); intervalTracking[++intervalCount]=interval; return interval; }); function clearAllIntervals() { for (var i = 0 ; i <= intervalCount ; i++) { window.clearInterval( intervalTracking[i] ); } }

¡Esto parece funcionar!