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?

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.

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.


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!



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);
    });
};


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>


-1

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.