2009-06-30 14 views
94

Estoy seguro de que leí sobre esto el otro día, pero parece que no puedo encontrarlo en ningún lado.
Tengo un evento fadeOut() después del cual elimino el elemento, pero jQuery está eliminando el elemento antes de que tenga la posibilidad de terminar de desvanecerse.
¿Cómo puedo obtener jQuery para esperar hasta que el elemento se haya desvanecido, y luego eliminarlo?¿Cómo hacer que jQuery espere hasta que se termine un efecto?

Respuesta

146

Puede especificar una función de devolución de llamada:

$(selector).fadeOut('slow', function() { 
    // will be called when the element finishes fading out 
    // if selector matches multiple elements it will be called once for each 
}); 

Documentation here.

+0

Bingo. Pensé que era eso, pero lo que tenía que hacer era poner toda mi función allí, no solo la parte eliminada. PD Si a alguien le interesa, el libro en el que lo leí y que he encontrado nuevamente es Learning JQuery - Better Interaction and Design. Gracias de nuevo – uriDium

+0

Si alguien tiene jQuery antiguo, este error de "devolución de animación hecha fue desagradable": http://bugs.jquery.com/ticket/5684 – JustAMartin

+1

Aquí va su número de upvote 100 – kaiser

6

si es algo que desea cambiar, atenuar uno y desvanecer otro en el mismo lugar, puede colocar un atributo {position: absolute} en los divs, para que las dos animaciones se superpongan, y usted no tiene que esperar a que termine una animación antes de comenzar la siguiente.

157

Con la versión jQuery 1.6 puede usar el método .promise().

$(selector).fadeOut('slow'); 
$(selector).promise().done(function(){ 
    // will be called when all the animations on the queue finish 
}); 
+2

Esto es redundante para la mayoría de las animaciones jQuery ya que hay argumentos de devolución de llamada en la mayoría de los métodos, pero usando 'promise()' o 'when()' y 'done()' puede aprovechar un comportamiento muy bueno de los métodos de terceros, o incluso los suyos propios. +1 para significar '.promise()'! – stuartc

+2

¡Gran solución! –

+4

No he oído esto antes, solo me salvó el trasero. – prismspecs

9

Puede también utilizar $.when() que esperar hasta que el promise final:

var myEvent = function() { 
    $(selector).fadeOut('fast'); 
}; 
$.when(myEvent()).done(function() { 
    console.log('Task finished.'); 
}); 

En caso de que usted está haciendo una solicitud para que así pudiera fallar, después, se puede ir un paso más allá:

$.when(myEvent()) 
    .done(function(d) { 
     console.log(d, 'Task done.'); 
    }) 
    .fail(function(err) { 
     console.log(err, 'Task failed.'); 
    }) 
    // Runs always 
    .then(function(data, textStatus, jqXHR) { 
     console.log(jqXHR.status, textStatus, 'Status 200/"OK"?'); 
    }); 
+1

Esta parte de esta respuesta que usa '$ .when()' no funciona porque 'myEvent()' no devuelve una promesa y '$.when() 'espera que le pase una o más promesas para que haga su trabajo. – jfriend00

Cuestiones relacionadas