funzione wait () o sleep () in jquery?


101

Voglio aggiungere una classe, attendere 2 secondi e aggiungere un'altra classe.

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

C'è un modo?

Risposte:


187

setTimeout eseguirà del codice dopo un certo periodo di tempo (misurato in millisecondi). Tuttavia, una nota importante: a causa della natura di javascript, il resto del codice continua a essere eseguito dopo l'impostazione del timer:

$('#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
questa è una soluzione scadente al momento perché perde il vantaggio di avere il controllo jquery sull'animazione, come .stop (). una soluzione molto migliore è .delay ()
user151496

7
@ user123blahblah ... questa è la soluzione CORRETTA per la domanda (che non ha nulla a che fare con l'animazione). .delay fa jack bean fuori dalla coda dell'animazione. Chiunque abbia votato per errore il tuo commento errato, è stato fuorviato.
IncredibleHat

34

Sarebbe .delay().

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

Se stai facendo cose AJAX, in realtà non dovresti semplicemente scrivere automaticamente "fatto", dovresti davvero aspettare una risposta e vedere se è effettivamente fatto.


1
Anche Steven vuoi che la .removeClass('load')tua aggiunta di entrambe le classi venga caricata e completata, il che probabilmente è indesiderato. Se stai effettivamente aspettando il completamento di un'azione asincrona, la soluzione migliore è fare .addClass QUANDO viene completato e ha successo, in caso contrario .addClass ('errore') forse un'idea
Gary Green

52
La funzione jQUery "delay ()" non fornisce in alcun modo qualcosa di simile a un servizio di "attesa" generico. Fa parte del sistema di animazione e si applica solo alla coda di animazione. La funzione ritorna sempre immediatamente e l'esecuzione continua senza pause.
Pointy

22

delay () non farà il lavoro. Il problema con delay () è che fa parte del sistema di animazione e si applica solo alle code di animazione.

E se volessi aspettare prima di eseguire qualcosa al di fuori dell'animazione?

Usa questo:

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

Cosa succede ?: In questo scenario attende 600 millisecondi prima di eseguire il codice specificato tra parentesi graffe.

Questo mi ha aiutato molto una volta che l'ho capito e spero che possa aiutare anche te!

AVVISO IMPORTANTE: "window.setTimeout" avviene in modo asincrono. Tienilo a mente quando scrivi il tuo codice!


20

Renditi conto che questa è una vecchia domanda, ma ho scritto un plugin per risolvere questo problema che qualcuno potrebbe trovare utile.

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

ti permette di fare questo:

$('#myElement').addClass('load').wait(2000).addClass('done');

2
Grazie mille madlee!
phil294

2

C'è una funzione, ma è extra: http://docs.jquery.com/Cookbook/wait

Questo piccolo frammento ti permette di aspettare:

$.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

Il plugin xml4jQuery fornisce il metodo sleep (ms, callback). La catena rimanente verrà eseguita dopo il periodo di sospensione.

$(".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

Utilizzando la funzione setTimeout, ad esempio Visita qui per esempio


21
È considerato meglio non fare affidamento su un link per la maggior parte della tua risposta
James Jenkins

6
Per eseguire il backup del commento @JamesJenkins, questo perché i collegamenti non sono sempre affidabili. Se una persona deve aggiungere un collegamento, è meglio includere anche il codice stesso nella risposta.
Tass
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.