¿Hay alguna forma de borrar todos los tiempos de espera de una ventana determinada? Supongo que los tiempos de espera se almacenan en algún lugar del window
objeto, pero no puedo confirmarlo.
Cualquier solución de navegador cruzado es bienvenida.
javascript
timeout
marcio
fuente
fuente
Respuestas:
No están en el objeto de ventana, pero tienen identificadores, que (afaik) son enteros consecutivos.
Por lo tanto, puede borrar todos los tiempos de espera de esta manera:
fuente
Creo que la forma más fácil de lograr esto sería almacenar todos los
setTimeout
identificadores en una matriz, donde puede iterar fácilmenteclearTimeout()
en todos ellos.fuente
Tengo una adición a la respuesta de Pumbaa80 que podría ser útil para alguien que esté desarrollando para IEs antiguas.
Sí, todos los navegadores principales implementan identificadores de tiempo de espera como enteros consecutivos (lo cual no es requerido por la especificación ). Aunque el número inicial difiere de un navegador a otro. Parece que Opera, Safari, Chrome e IE> 8 inician identificadores de tiempo de espera de 1, navegadores basados en Gecko de 2 e IE <= 8 de algún número aleatorio que se guarda mágicamente en la actualización de pestañas. Puedes descubrirlo tú mismo .
Todo eso significa que en IE <= 8 el
while (lastTimeoutId--)
ciclo puede correr más de 8 dígitos y mostrar el mensaje " Un script en esta página hace que Internet Explorer se ejecute lentamente ". Entonces, si no puede guardar todos sus identificadores de tiempo de espera o no desea anular window.setTimeout , puede considerar guardar el primer identificador de tiempo de espera en una página y borrar los tiempos de espera hasta ese momento.Ejecute el código en la carga de la página inicial:
Y luego borre todos los tiempos de espera pendientes que probablemente fueron establecidos por código externo tantas veces como desee
fuente
¿Qué tal almacenar los identificadores de tiempo de espera en una matriz global y definir un método para delegar la llamada de función a la ventana.
fuente
Tienes que reescribir el
window.setTimeout
método y guardar su ID de tiempo de espera.fuente
Para borrar todos los tiempos de espera , primero deben "capturarse" :
Coloque el siguiente código antes de cualquier otro script y creará una función contenedora para el
setTimeout
& originalclearTimeout
.Se
clearTimeouts
agregarán nuevos métodos alwindow
Objeto, que permitirán borrar todos los tiempos de espera (pendientes) ( enlace Gist ).fuente
Para completar, quería publicar una solución general que cubra tanto
setTimeout
ysetInterval
.Parece que los navegadores pueden usar el mismo grupo de ID para ambos, pero de algunas de las respuestas a ¿Son clearTimeout y clearInterval iguales? , no está claro si es seguro confiar
clearTimeout
yclearInterval
realizar la misma función o solo trabajar en sus respectivos tipos de temporizador.Por lo tanto, cuando el objetivo es eliminar todos los tiempos de espera e intervalos, aquí hay una implementación que podría ser un poco más defensiva en todas las implementaciones cuando no se pueden probar todas:
Puede usarlo para borrar todos los temporizadores en la ventana actual:
O puede usarlo para borrar todos los temporizadores en un
iframe
:fuente
Yo uso Vue con Typescript.
fuente
Utilice un tiempo de espera global del que derivan todas sus otras funciones. Esto hará que todo se ejecute más rápido y sea más fácil de administrar, aunque agregará algo de abstracción a su código.
fuente
set_timeout
función global? ¿Podría darnos un código de ejemplo?Acabamos de publicar un paquete que resuelve este problema exacto.
npm install time-events-manager
Con eso, puede ver todos los tiempos de espera e intervalos a través de
timeoutCollection
&intervalCollection
objetos. También hay unaremoveAll
función que borra todos los tiempos de espera / intervalos tanto de la colección como del navegador.fuente
Esto es muy tarde ... pero:
Básicamente, los ID de setTimeout / setInterval van en orden consecutivo, así que simplemente cree una función de tiempo de espera ficticio para obtener el ID más alto, luego borre el intervalo en todos los ID inferiores a ese.
fuente