funkcja wait () lub sleep () w jquery?

101

Chcę dodać klasę, odczekaj 2 sekundy i dodaj kolejną.

.addClass("load").wait(2sec).addClass("done");

Czy jest jakiś sposób?

Steven Moss
źródło

Odpowiedzi:

187

setTimeout wykona kod po pewnym czasie (mierzonym w milisekundach). Jednak ważna uwaga: ze względu na naturę javascript reszta kodu nadal działa po skonfigurowaniu timera:

$('#someid').addClass("load");

setTimeout(function(){
  $('#someid').addClass("done");
}, 2000);

// Any code here will execute immediately after the 'load' class is added to the element.
ctcherry
źródło
2
jest to obecnie kiepskie rozwiązanie, ponieważ traci przewagę wynikającą z posiadania kontroli jquery nad animacją, takiej jak .stop (). znacznie lepszym rozwiązaniem jest .delay ()
user151496
7
@ user123blahblah ... to jest WŁAŚCIWE rozwiązanie tego pytania (które nie ma nic wspólnego z animacją). .delay powoduje, że jack Bean jest poza kolejką animacji. Każdy, kto poparł Twój błędny komentarz, został wprowadzony w błąd.
IncredibleHat
34

Tak by było .delay().

http://api.jquery.com/delay/

Jeśli jednak robisz rzeczy AJAX, naprawdę nie powinieneś po prostu automatycznie pisać „gotowe”, powinieneś naprawdę poczekać na odpowiedź i zobaczyć, czy faktycznie jest zrobiona.

Oscar Godson
źródło
1
Poza tym, Steven, chcesz w .removeClass('load')przeciwnym razie załadować i zakończyć dodawanie obu klas, co jest prawdopodobnie niepożądane. Jeśli rzeczywiście czekasz na zakończenie akcji asynchronicznej, najlepiej jest zrobić .addClass KIEDY zakończy się i zakończy się sukcesem, jeśli nie .addClass ('błąd') może być pomysłem
Gary Green
52
Funkcja „delay ()” jQUery w żaden sposób nie zapewnia czegoś podobnego do ogólnego przeznaczenia „czekania”. Jest częścią systemu animacji i dotyczy tylko kolejki animacji. Funkcja zawsze wraca natychmiast, a wykonanie jest kontynuowane bez przerwy.
Pointy
22

delay () nie wykona zadania. Problem z delay () jest częścią systemu animacji i dotyczy tylko kolejek animacji.

A co jeśli chcesz zaczekać przed wykonaniem czegoś poza animacją?

Użyj tego:

window.setTimeout(function(){
                 // do whatever you want to do     
                  }, 600);

Co się dzieje ?: W tym scenariuszu czeka 600 milisekund przed wykonaniem kodu określonego w nawiasach klamrowych.

To bardzo mi pomogło, kiedy już to rozgryzłem i mam nadzieję, że pomoże to również Tobie!

WAŻNA UWAGA: „window.setTimeout” działa asynchronicznie. Miej to na uwadze podczas pisania kodu!

J. Louw
źródło
20

Zdaj sobie sprawę, że to stare pytanie, ale napisałem wtyczkę, aby rozwiązać ten problem, która może być przydatna.

https://github.com/madbook/jquery.wait

pozwala ci to zrobić:

$('#myElement').addClass('load').wait(2000).addClass('done');
madlee
źródło
2
Dziękuję bardzo madlee!
phil294
2

Jest funkcja, ale jest dodatkowa: http://docs.jquery.com/Cookbook/wait

Ten mały fragment pozwala poczekać:

$.fn.wait = function(time, type) {
    time = time || 1000;
    type = type || "fx";
    return this.queue(type, function() {
        var self = this;
        setTimeout(function() {
            $(self).dequeue();
        }, time);
    });
};
mrzmyr
źródło
2

Możesz użyć .delay()funkcji.
Oto, czego szukasz:

.addClass("load").delay(2000).addClass("done");
Blog dla programistów internetowych
źródło
0

Wtyczka xml4jQuery udostępnia metodę uśpienia (ms, callback). Pozostały łańcuch zostałby wykonany po okresie snu.

$(".toFill").html("Click here")
                .$on('click')
                .html('Loading...')
                .sleep(1000)
                .html( 'done')
                .toggleClass('clickable')
                .prepend('Still clickable <hr/>');
.toFill{border: dashed 2px palegreen; border-radius: 1em; display: inline-block;padding: 1em;}
        .clickable{ cursor: pointer; border-color: blue;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   <script type="text/javascript" src="https://cdn.xml4jquery.com/ajax/libs/xml4jquery/1.1.2/xml4jquery.js"></script>
        <div class="toFill clickable"></div>

Sasha Firsov
źródło
-1

Korzystanie z funkcji setTimeout, na przykład Odwiedź tutaj

Abhinav Ranjan Sinha
źródło
21
Uważa się, że najlepiej nie polegać na linku w przypadku większości odpowiedzi
James Jenkins,
6
Aby utworzyć kopię zapasową komentarza @JamesJenkins, dzieje się tak, ponieważ linki nie zawsze są niezawodne. Jeśli ktoś ma dodać link, najlepiej zawrzeć w odpowiedzi również sam kod.
Tass