Powodem, dla którego musisz zadzwonić nextlub dequeuejest to, aby powiadomić jQuery, że skończyłeś z tym elementem w kolejce i że powinien przejść do następnego.
Podoba mi się ta opcja, ponieważ ułatwia ona przekazanie odwołania do obiektu jquery, który jest używany w funkcji kolejkowej, dzięki czemu może być używany w bardziej ogólnym kontekście (bez nazw zakodowanych na stałe).
GrandmasterB
5
Po co nam „następny”? Czy możemy zrobić $ ("# div"). AddClass ("error"). Delay (1000) .queue (function () {$ (this) .removeClass ("error");}); Wydaje się bardziej eleganckie?
Vennsoh,
@Vennsoh Nie musisz przekazywać „następnej” pozycji w kolejce. Możesz zamiast tego użyć
gfullam.
49
AFAIK, metoda opóźnienia działa tylko w przypadku numerycznych modyfikacji CSS.
Do innych celów JavaScript zawiera metodę setTimeout:
+1: Nie używaj Jquery ze względu na Jquery. Istnieją proste rozwiązania wielu problemów w języku JavaScript.
Joel
1
+1: Tak samo jak pierwszy komentarz. Prosty JS również czasami działa dobrze.
wowpatrick
1
+1 dla uproszczenia, ale również dało +1 zaakceptowanej odpowiedzi - ponieważ wskazało mi, że .queue () w rzeczywistości przekazuje obiekt kontynuacji, który należy wywołać ręcznie ('next ()'). Spędziłem pół godziny na zastanawianiu się, dlaczego mój łańcuch bezparametrowych wywołań zwrotnych wykonuje tylko pierwszy - wiele przykładów na innych witrynach używa pojedynczego opóźnienia w łańcuchu i bezparametrowego wywołania zwrotnego, co jest nieco mylącym uproszczeniem tego mechanizmu
quetzalcoatl
1
Tylko pedant uwaga: setTimeout pochodzi z obiektu okna przeglądarki (BOM). JavaScript (rozumiany jako ECMA Script) nie ma tej metody.
corbacho
9
Wiem, że to bardzo stary post, ale połączyłem kilka odpowiedzi w funkcję opakowującą jQuery, która obsługuje łączenie. Mam nadzieję, że to komuś przyniesie korzyści:
@MattYao Nie sądzę, żebyś rozumiał. Jeśli nie użyjesz setTimeout, to opóźnienie nie zadziała
Alex Jolig,
1
Rozwiązanie nie musi działać razem. Albo użyj delay () z queue () w jQuery, albo po prostu użyj setTimeout (), aby rozwiązać problem. Nie twierdzę, że twoja odpowiedź jest błędna.
MattYao,
0
Spróbuj tego:
function removeClassDelayed(jqObj, c, to){
setTimeout(function(){ jqObj.removeClass(c);}, to);}
removeClassDelayed($("#div"),"error",1000);
$("#div").addClassTemporarily("error",1000)
Odpowiedzi:
Możesz utworzyć nową pozycję w kolejce, aby usunąć klasę:
Lub używając metody usuwania z kolejki :
Powodem, dla którego musisz zadzwonić
next
lubdequeue
jest to, aby powiadomić jQuery, że skończyłeś z tym elementem w kolejce i że powinien przejść do następnego.źródło
AFAIK, metoda opóźnienia działa tylko w przypadku numerycznych modyfikacji CSS.
Do innych celów JavaScript zawiera metodę setTimeout:
źródło
Wiem, że to bardzo stary post, ale połączyłem kilka odpowiedzi w funkcję opakowującą jQuery, która obsługuje łączenie. Mam nadzieję, że to komuś przyniesie korzyści:
A oto opakowanie removeClass:
Teraz możesz robić takie rzeczy - poczekaj 1sek, dodaj
.error
, poczekaj 3sek, usuń.error
:$('#div').delay(1000).queueAddClass('error').delay(2000).queueRemoveClass('error');
źródło
Manipulacja CSS jQuery nie jest umieszczana w kolejce, ale możesz ją wykonać wewnątrz kolejki `` fx '', wykonując:
Całkiem to samo, co wywołanie setTimeout, ale zamiast tego używa mechanizmu kolejki jQuery.
źródło
Oczywiście byłoby łatwiej, gdybyś rozszerzył jQuery w ten sposób:
potem możesz użyć tej funkcji, takiej jak addClass:
źródło
return this
do funkcji ...Opóźnienie działa na kolejce. i o ile wiem, manipulacja css (inna niż przez animate) nie jest w kolejce.
źródło
delay
nie działa na żadnej funkcji kolejki, więc powinniśmy użyćsetTimeout()
.I nie musisz oddzielać rzeczy. Wszystko, co musisz zrobić, to uwzględnić wszystko w
setTimeOut
metodzie:źródło
Spróbuj tego:
źródło
Wypróbuj tę prostą funkcję strzałki:
setTimeout( () => { $("#div").addClass("error") }, 900 );
źródło