Existe-t-il un moyen d'effacer tous les temps morts d'une fenêtre donnée? Je suppose que les délais d'attente sont stockés quelque part dans l' window
objet, mais je n'ai pas pu le confirmer.
Toute solution multi-navigateurs est la bienvenue.
javascript
timeout
marcio
la source
la source
Réponses:
Ils ne sont pas dans l'objet window, mais ils ont des identifiants, qui (afaik) sont des entiers consécutifs.
Vous pouvez donc effacer tous les délais comme suit:
la source
Je pense que le moyen le plus simple d'y parvenir serait de stocker tous les
setTimeout
identifiants dans un seul tableau, où vous pouvez facilement les parcourirclearTimeout()
sur chacun d'eux.la source
J'ai un ajout à la réponse de Pumbaa80 qui pourrait être utile pour quelqu'un qui développe pour d'anciens IE.
Oui, tous les principaux navigateurs implémentent les identifiants de délai d'expiration sous forme d'entiers consécutifs (ce qui n'est pas requis par la spécification ). Bien que le numéro de départ diffère d'un navigateur à l'autre. Il semble qu'Opera, Safari, Chrome et IE> 8 démarre les identifiants de délai d'expiration à partir de 1, les navigateurs basés sur Gecko à partir de 2 et IE <= 8 à partir d'un nombre aléatoire enregistré comme par magie lors de l'actualisation de l'onglet. Vous pouvez le découvrir vous-même .
Tout cela signifie que dans IE <= 8, le
while (lastTimeoutId--)
cycle peut s'exécuter plus de 8 chiffres et afficher le message « Un script sur cette page provoque l'exécution lente d'Internet Explorer ». Donc, si vous ne pouvez pas enregistrer tous vos identifiants de délai d'expiration ou si vous ne voulez pas remplacer window.setTimeout, vous pouvez envisager d'enregistrer le premier identifiant d'expiration sur une page et de supprimer les délais d'attente jusqu'à ce qu'il.Exécutez le code au début du chargement de la page:
Et puis effacez tous les délais d'attente qui ont probablement été définis par un code étranger tant de fois que vous le souhaitez
la source
Que diriez-vous de stocker les identifiants de délai d'expiration dans un tableau global et de définir une méthode pour déléguer l'appel de fonction à la fenêtre.
la source
Vous devez réécrire la
window.setTimeout
méthode et enregistrer son ID de délai d'expiration.la source
Pour effacer tous les délais d' attente , ils doivent être « capturés » premier :
Placez le code ci-dessous avant tout autre script et cela créera une fonction wrapper pour l'original
setTimeout
&clearTimeout
.Une nouvelle
clearTimeouts
méthode sera ajoutée à l'window
objet, ce qui permettra d'effacer tous les délais (en attente) ( lien Gist ).la source
Par souci d'exhaustivité, je souhaitais publier une solution générale couvrant à la fois
setTimeout
etsetInterval
.Il semble que les navigateurs puissent utiliser le même pool d'identifiants pour les deux, mais à partir de certaines réponses à ClearTimeout et clearInterval sont-elles identiques? , il n'est pas clair s'il est sûr de se fier
clearTimeout
etclearInterval
exécuter la même fonction ou de ne travailler que sur leurs types de minuterie respectifs.Par conséquent, lorsque l'objectif est de supprimer tous les délais et intervalles, voici une implémentation qui pourrait être légèrement plus défensive entre les implémentations lorsqu'elle ne peut pas toutes les tester:
Vous pouvez l'utiliser pour effacer tous les minuteurs de la fenêtre actuelle:
Ou vous pouvez l'utiliser pour effacer tous les minuteurs dans un
iframe
:la source
J'utilise Vue avec Typescript.
la source
Utilisez un délai d'expiration global dont toutes vos autres fonctions dérivent la synchronisation. Cela rendra tout plus rapide et plus facile à gérer, même si cela ajoutera une certaine abstraction à votre code.
la source
set_timeout
fonction globale? Pouvez-vous donner un exemple de code?Nous venons de publier un package résolvant exactement ce problème.
npm install time-events-manager
Avec cela, vous pouvez afficher tous les délais et intervalles via
timeoutCollection
&intervalCollection
objets. Il existe également uneremoveAll
fonction qui efface tous les délais / intervalles à la fois de la collection et du navigateur.la source
C'est très tard ... mais:
Fondamentalement, les ID setTimeout / setInterval vont dans un ordre consécutif, il suffit donc de créer une fonction de temporisation fictive pour obtenir l'ID le plus élevé, puis d'effacer l'intervalle sur tous les ID inférieurs.
la source