esperar () o dormir () función en jquery?

101

Quiero agregar una clase, esperar 2 segundos y agregar otra clase.

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

¿Hay alguna manera?

Steven Moss
fuente

Respuestas:

186

setTimeout ejecutará algún código después de un retraso de un período de tiempo (medido en milisegundos). Sin embargo, una nota importante: debido a la naturaleza de javascript, el resto del código continúa ejecutándose después de que se configura el temporizador:

$('#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
fuente
2
esta es una mala solución en este momento porque pierde la ventaja de tener el control de jquery sobre la animación, como .stop (). una solución mucho mejor es .delay ()
user151496
7
@ user123blahblah ... esta es la solución APROPIADA para la pregunta (que no tiene nada que ver con la animación). .delay hace jack beans fuera de la cola de animación. Quienquiera que votó a favor de su comentario erróneo, se engañó a sí mismo.
IncredibleHat
34

Eso sería .delay().

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

Sin embargo, si estás haciendo cosas AJAX, no deberías escribir automáticamente "hecho", sino que deberías esperar una respuesta y ver si realmente está hecho.

Oscar Ahijado
fuente
1
También Steven, de lo .removeClass('load')contrario, desea agregar ambas clases, cargar y listo, lo que probablemente no sea deseado. Si de hecho está esperando a que se complete una acción asincrónica, su mejor opción es hacer .addClass CUANDO se complete y tenga éxito, si no .addClass ('error') tal vez sea una idea
Gary Green
52
La función jQUery "delay ()" de ninguna manera proporciona nada parecido a una función de "espera" de propósito general. Es parte del sistema de animación y solo se aplica a la cola de animación. La función siempre regresa inmediatamente y la ejecución continúa sin pausa.
Puntiagudo
22

delay () no hará el trabajo. El problema con delay () es que es parte del sistema de animación y solo se aplica a las colas de animación.

¿Qué pasa si quieres esperar antes de ejecutar algo fuera de la animación?

Utilizar este:

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

¿Qué sucede ?: En este escenario, espera 600 milisegundos antes de ejecutar el código especificado entre las llaves.

¡Esto me ayudó mucho una vez que lo descubrí y espero que también te ayude a ti!

AVISO IMPORTANTE: 'window.setTimeout' ocurre de forma asincrónica. ¡Tenga esto en cuenta al escribir su código!

J. Louw
fuente
20

Tenga en cuenta que esta es una pregunta antigua, pero escribí un complemento para abordar este problema que alguien podría encontrar útil.

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

te permite hacer esto:

$('#myElement').addClass('load').wait(2000).addClass('done');
Madlee
fuente
2
¡Muchas gracias madlee!
phil294
2

Hay una función, pero es adicional: http://docs.jquery.com/Cookbook/wait

Este pequeño fragmento te permite esperar:

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

Puede utilizar la .delay()función.
Esto es lo que buscas:

.addClass("load").delay(2000).addClass("done");
Blog del desarrollador web
fuente
0

El complemento xml4jQuery proporciona el método sleep (ms, callback). La cadena restante se ejecutará después del período de suspensión.

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

Usando la función setTimeout, por ejemplo Visite aquí por ejemplo

Abhinav Ranjan Sinha
fuente
21
Se considera mejor no confiar en un enlace para la mayor parte de su respuesta
James Jenkins
6
Para respaldar el comentario de @JamesJenkins, esto se debe a que los enlaces no siempre son confiables. Si una persona va a agregar un enlace, es mejor incluir también el código en su respuesta.
Tass