La raison pour laquelle vous devez appeler nextou dequeueest pour faire savoir à jQuery que vous avez terminé avec cet élément en file d'attente et qu'il doit passer au suivant.
J'aime cette option car elle permet de passer facilement une référence à l'objet jquery qui est utilisé dans la fonction en file d'attente, afin de pouvoir l'utiliser dans un contexte plus générique (sans noms codés en dur).
GrandmasterB
5
Pourquoi avons-nous besoin de «suivant»? Pouvons-nous faire $ ("# div"). AddClass ("erreur"). Delay (1000) .queue (function () {$ (this) .removeClass ("error");}); Semble plus élégant?
Vennsoh
@Vennsoh Vous n'avez pas besoin de passer un élément de file d'attente «suivant». Vous pouvez choisir d'utiliser la méthode dequeue
gfullam
49
AFAIK la méthode de délai ne fonctionne que pour les modifications CSS numériques.
À d'autres fins, JavaScript est fourni avec une méthode setTimeout:
+1: N'utilisez pas Jquery pour Jquery. Il existe des solutions javascript simples à de nombreux problèmes.
Joel
1
+1: identique au premier commentaire. Simple JS fonctionne également très bien quelques fois.
wowpatrick
1
+1 pour simplifier, mais aussi +1 pour la réponse acceptée - car elle m'a fait remarquer que le .queue () passe en fait l'objet de continuation qui doit être appelé manuellement (le 'next ()'). J'ai passé une demi-heure à me demander pourquoi ma chaîne de rappels sans paramètre n'exécute que le premier - de nombreux exemples sur d'autres sites utilisent un seul délai dans la chaîne et un rappel sans paramètre, ce qui est une simplification un peu trompeuse de ce mécanisme
quetzalcoatl
1
Juste une note pédante: setTimeout provient de l'objet fenêtre du navigateur (BOM). JavaScript (compris comme ECMA Script) n'a pas cette méthode.
corbacho
9
Je sais que c'est un très vieux message, mais j'ai combiné quelques-unes des réponses dans une fonction wrapper jQuery qui prend en charge le chaînage. J'espère que cela profite à quelqu'un:
Vous n'avez pas besoin d'utiliser delay () avec setTimeout ().
MattYao
@MattYao Je ne pense pas que vous compreniez l'idée. Si vous n'utilisez pas setTimeout, alors ce retard ne fonctionnera pas
Alex Jolig
1
La solution n'a pas besoin des deux pour fonctionner ensemble. Soit utiliser delay () avec queue () dans jQuery ou simplement utiliser setTimeout () peut résoudre le problème. Je ne dis pas que votre réponse est fausse.
MattYao
0
Essaye ça:
function removeClassDelayed(jqObj, c, to){
setTimeout(function(){ jqObj.removeClass(c);}, to);}
removeClassDelayed($("#div"),"error",1000);
$("#div").addClassTemporarily("error",1000)
Réponses:
Vous pouvez créer un nouvel élément de file d'attente pour supprimer la classe:
Ou en utilisant la méthode de file d'attente :
La raison pour laquelle vous devez appeler
next
oudequeue
est pour faire savoir à jQuery que vous avez terminé avec cet élément en file d'attente et qu'il doit passer au suivant.la source
AFAIK la méthode de délai ne fonctionne que pour les modifications CSS numériques.
À d'autres fins, JavaScript est fourni avec une méthode setTimeout:
la source
Je sais que c'est un très vieux message, mais j'ai combiné quelques-unes des réponses dans une fonction wrapper jQuery qui prend en charge le chaînage. J'espère que cela profite à quelqu'un:
Et voici un wrapper removeClass:
Maintenant, vous pouvez faire des choses comme ça - attendez 1 seconde, ajoutez
.error
, attendez 3 secondes, supprimez.error
:$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
la source
La manipulation CSS de jQuery n'est pas mise en file d'attente, mais vous pouvez l'exécuter dans la file d'attente 'fx' en faisant:
Tout à fait la même chose que d'appeler setTimeout mais utilise à la place le mécanisme de file d'attente de jQuery.
la source
Bien sûr, ce serait plus simple si vous étendez jQuery comme ceci:
après cela, vous pouvez utiliser cette fonction comme addClass:
la source
return this
à la fonction ...Le délai fonctionne sur une file d'attente. et pour autant que je sache, la manipulation css (autre que via animate) n'est pas mise en file d'attente.
la source
delay
ne fonctionne pas sur aucune fonction de file d'attente, nous devrions donc utilisersetTimeout()
.Et vous n'avez pas besoin de séparer les choses. Tout ce que vous avez à faire est de tout inclure dans une
setTimeOut
méthode:la source
Essaye ça:
la source
Essayez cette simple fonction de flèche:
setTimeout( () => { $("#div").addClass("error") }, 900 );
la source