57 votes

Comment puis-je désactiver tous les événements setTimeout ?

J'utilise ajax et asp.net. J'ai une fonction javascript qui crée de nombreuses autres fonctions javascript avec setTimeout. Après que le postback asynchrone se soit produit, je veux désactiver tous ces événements setTimeouted. Comment puis-je faire cela ?

120voto

SeanDowney Points 5299

Si vous ne pouvez pas accéder au code dans lequel la minuterie est réglée, la réponse de Nick risque de ne pas fonctionner, alors tout ce que je peux penser est ce hack.

C'est un hack, à utiliser avec précaution !

// Set a fake timeout to get the highest timeout id
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
    clearTimeout(i); 
}

En fait, il prend l'identifiant le plus élevé et efface tout ce qui est inférieur. Mais il est également possible d'effacer d'autres minuteurs que vous ne souhaitez pas effacer !

0 votes

Grâce à Vaidotas, j'ai mis à jour ma fonction "set timeout" pour qu'elle soit plus conviviale pour les navigateurs.

16 votes

+1 c'est un snippet très pratique à coller dans la console Javascript pour désactiver tous les délais d'attente !

3 votes

Ce hack cause des bugs difficiles à attraper car si une bibliothèque tierce utilise setTimout et setInterval pour l'initialisation, cette bibliothèque cessera de fonctionner sans raison, comme je viens de le découvrir.

111voto

Nick Craver Points 313913

Lorsque vous appelez setTimeout() Dans le cas de l'utilisation d'une carte de crédit, enregistrez l'ID de la minuterie pour pouvoir l'effacer. Si vous créez plusieurs temporisations, un tableau est une bonne option pour stocker les ID. Par exemple :

var timeouts = [];
//then, store when you create them
timeouts.push( setTimeout( { ... }, 1000) );

Ensuite, quand vous voulez les effacer :

for (var i = 0; i < timeouts.length; i++) {
    clearTimeout(timeouts[i]);
}
//quick reset of the timer array you just cleared
timeouts = [];

En @Robert noté ci-dessous, clearTimeout() ne lancera pas d'erreur si le délai d'attente s'est déjà produit, il n'y a donc pas de problème de course/temporalité ici.

6 votes

A noter également, clearTimeout() ne déclenchera pas d'exception si un ID invalide est passé (si le délai d'attente a déjà eu lieu).

0 votes

@Robert - Bon point, j'ai tendance à prendre cela pour acquis mais je vais l'ajouter, au cas où il y aurait des inquiétudes à ce sujet :)

0 votes

J'aimerais penser qu'avec le modèle monofilaire de javascript que : Dans tous les cas, une fois clearTimeout terminé, il y a une garantie que l'événement timeout ne se reproduira pas. Ce n'est pas dans la documentation, cela va-t-il de soi ?

4voto

Robin Points 2615

Je ne sais pas si vous pouvez le faire globalement, mais la méthode la plus courante est d'utiliser clearTimeout . Vous passez la valeur de retour de setTimeout() à clearTimeout(), vous pouvez utiliser une variable globale pour stocker toutes les variables de timeout.

3voto

Tout d'abord, j'utilisais ce code :

var x = setTimeout('');
for (var i = 0; i < x; i++)
    clearTimeout(x);

Cependant, cette paix du code ne fonctionnait pas sur Google Chrome. J'ai donc fait une amélioration pour cela :

var x = setTimeout('alert("x");',100000); //It is very low probability that after 100 seconds x timeout will not be cleared
for (var i = 0; i <= x; i++)
    clearTimeout(i);

Enfin, il s'agit d'un hack, comme il a été mentionné dans le commentaire ci-dessus, donc à utiliser avec précaution.

Edit : correction de la mauvaise variable utilisée dans la boucle (utiliser i au lieu de x)

1voto

Super Model Points 1

Vous pouvez arrêter setTimeout() d'une fonction dans une autre fonction en utilisant clearTimeout()

var myVar;

function myFunction() {
  myVar = setTimeout(function(){ alert("Hello"); }, 3000);
}

function myStopFunction() {
  clearTimeout(myVar);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X