2011-07-27 8 views
20

decir que alguien (el mal) nos ha puesto un temporizador con setInterval, pero no conocemos su identidad (no tenemos la referencia al objeto, que está regresando setInterval, ni su valor)¿Cómo borrarInterval con ID desconocida?

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

¿Hay alguna manera, cómo borrarlo? ¿Es posible acceder al temporizador de otra manera? ¿O al menos en un navegador/motor de JavaScript en particular?

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

... Algunos navegadores detect cuadros de diálogo y scripts de larga duración repite y le da al usuario la opción para 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 es ninguna manera general de que los navegadores web pueden evitar este tipo de ataque de mano dura. En la práctica, esto no es un problema común en la web ya que nadie vuelve a un sitio que se involucra en este tipo de abuso de secuencias de comandos!

+2

Relacionados - http://stackoverflow.com/questions/3141064/how-to-stop-all-timeouts-and-intervals-using-javascript –

+0

Hmm .. otra idea - por casualidad dan a la función una ¿nombre? –

+0

Shadow Wizard, en este caso, desafortunadamente se configuró en el cierre (que a veces se considera una buena característica para usar con fines de seguridad) .. sé que esta pregunta es algo teórica, porque es probable que en la mayoría de los casos podamos encontrar y edite localmente el desagradable código en algunos navegadores – mykhal

Respuesta

36

De prueba rápida, todos los principales navegadores (última Chrome, Firefox e IE) dan los números bastante pequeños como el ID de bucle por lo que sólo "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 intervalos, no puede dejar de intervalo específico sin conocer su ID, por supuesto.

Como se puede comprobar por sí mismo, que debería funcionar en todos los navegadores antes mencionados.

+3

fuerza bruta, buena respuesta, ya que creo que el OP recibirá ! – Jamiec

+0

también vea mi comentario debajo de la respuesta de Hans B PUFAL :) – mykhal

+0

Bueno, mi camino funcionará incluso si hay muchos intervalos activados en diferentes puntos del código, sin embargo, claramente, la manera de Hans es más elegante y eficiente. –

10

Bueno, las pruebas empíricas en Chrome muestran que setInterval devuelve un número que se incrementa para cada llamada. Así que si usted está seguro de que setInterval se estableció el último el siguiente funcionaría:

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

No estoy seguro de que recomendaría esto, sin embargo ;-)

+0

es una manera posible :) algo como 'pausaIntervalo 'sería útil para encontrar manualmente el temporizador adecuado, ya que no queremos matar a los inocentes .. – mykhal

4

He probado el enfoque sugerido por el Asistente #Shadow y funcionó en la limpieza del 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 Me instalados en es una solución de limpiador, que es redefinir el método setInterval y guardar los identificadores de intervalo en los métodos de re-definido. Como se muestra aquí, coloco los identificadores en una matriz y luego los borro a todos. Con un poco más de refinamiento de la estructura para almacenar las matrices, puede etiquetarlas y borrarlas 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!

+0

Bueno, está [de hecho trabajando] (http://jsfiddle.net/vMRya/5/)! –

0

Lo resuelto mediante el uso de almacenamiento local, ahorrando allí el id de la setInterval, y recogiendo más tarde con el fin de despejar ese intervalo ..

Cuestiones relacionadas