Détails
Comment définir un délai en javascript
J'ai installé un élément de js dans mon site Web pour changer d'image, mais j'ai besoin d'un délai lorsque vous cliquez sur l'image une deuxième fois. Le délai doit être de 1000ms. Vous cliquez donc sur l'image img.jpg, puis l'image img_onclick.jpg apparaît. Vous cliquez ensuite sur l'image img_onclick.jpg et il doit y avoir un délai de 1000 ms avant que l'image img.jpg ne s'affiche à nouveau.
Voici le code :
jQuery(document).ready(function($) {
$(".toggle-container").hide();
$(".trigger").toggle(function () {
$(this).addClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img_onclick.jpg');
}, function () {
$(this).removeClass("active");
$(".trigger").find('img').prop('src', 'http://localhost:8888/images/img.jpg');
});
$(".trigger").click(function () {
$(this).next(".toggle-container").slideToggle();
});
});
143
3
Utilisez
setTimeout()
:Si vous voulez le faire sans
setTimeout
: Reportez-vous à [cette question][1].[1] : https://stackoverflow.com/questions/1183872/
Placez votre code à l'intérieur du
{ }
.500
= 0.5 secondes2200
= 2,2 secondesetc.
Il y a deux types (les plus utilisés) de fonction timer en javascript :
setTimeout
etsetInterval
([other][1])Ces deux méthodes ont la même signature. Elles prennent une fonction de rappel et un délai comme paramètre.
setTimeout
ne s'exécute qu'une fois après le délai alors quesetInterval
continue d'appeler la fonction de rappel après chaque milisec de délai.Ces deux méthodes renvoient un identifiant entier qui peut être utilisé pour les effacer avant l'expiration du délai.
clearTimeout
etclearInterval
Ces deux méthodes prennent un identifiant entier retourné par les fonctions ci-dessussetTimeout
etsetInterval
.Exemple:
[setTimeout][2].
Si vous exécutez le code ci-dessus, vous verrez qu'il alerte
avant setTimeout
puisaprès setTimeout
et enfin il alerteJe suis setTimeout
après 1sec (1000ms).Ce que vous pouvez remarquer dans cet exemple, c'est que la fonction
setTimeout(...)
est asynchrone, ce qui signifie qu'elle n'attend pas que le délai soit écoulé avant de passer à l'instruction suivante, c'est-à-direalert("after setTimeout" ;);
.Exemple:
[setInterval][3]
Si vous exécutez le code ci-dessus, vous verrez qu'il alerte
avant setInterval
puisaprès setInterval
; enfin, il alerteje suis setInterval
5 fois après 1sec (1000ms) parce que le setTimeout efface le timer après 5 secondes ; sinon, toutes les 1sec, vous obtiendrez une alerteje suis setInterval
infinie.Comment le navigateur fait-il cela en interne?
Je vais vous l'expliquer en quelques mots.
Pour comprendre cela, vous devez connaître la file d'attente des événements en javascript. Il y a une file d'attente d'événements implémentée dans le navigateur. Chaque fois qu'un événement est déclenché en javascript, tous ces événements (comme un clic, etc.) sont ajoutés à cette file. Lorsque votre navigateur n'a rien à exécuter, il prend un événement de la file d'attente et les exécute un par un.
Maintenant, lorsque vous appelez
setTimeout
ousetInterval
votre callback est enregistré dans un timer dans le navigateur et il est ajouté à la file d'attente des événements après que le temps donné expire et finalement javascript prend l'événement de la file d'attente et l'exécute.Cela se passe ainsi, parce que le moteur javascript est un thread unique et qu'il ne peut exécuter qu'une seule chose à la fois. Donc, ils ne peuvent pas exécuter d'autres javascript et garder la trace de votre timer. C'est pourquoi ces timers sont enregistrés avec le navigateur (le navigateur n'est pas un thread unique) et il peut garder la trace du timer et ajouter un événement dans la file d'attente après l'expiration du timer.
Il en va de même pour
setInterval
, mais dans ce cas l'événement est ajouté à la file d'attente encore et encore après l'intervalle spécifié jusqu'à ce qu'il soit effacé ou que la page du navigateur soit rafraîchie.Par conséquent, votre callback peut parfois prendre plus de temps que le délai spécifié pour être appelé, en particulier lorsque votre autre code bloque le thread et ne lui donne pas le temps de traiter ce qui se trouve dans la file d'attente.
Et comme je l'ai mentionné, javascript est un thread unique. Donc, si vous bloquez le thread pendant longtemps.
Comme ce code
Votre utilisateur peut recevoir un message disant page not responding.
[1] : https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Timers [2] : https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout [3] : https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval