2009-06-30 11 views
94

Sono sicuro di aver letto di questo l'altro giorno ma non riesco a trovarlo da nessuna parte.
Ho un evento fadeOut() dopo di che posso rimuovere l'elemento, ma jQuery è la rimozione dell'elemento prima che abbia la possibilità di terminare la dissolvenza in chiusura.
Come posso ottenere jQuery per attendere che l'elemento si era sbiadito, poi rimuoverlo?Come ottenere jQuery per attendere fino al termine di un effetto?

risposta

146

È possibile specificare una funzione di callback:

$(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. Ho pensato che fosse così, ma quello che dovevo fare era mettere la mia intera funzione lì dentro non solo la parte rimossa. Post scriptum Se qualcuno è interessato, il libro che ho letto e che ho trovato di nuovo è Learning JQuery - Better Interaction and Design. Grazie ancora – uriDium

+0

Se qualcuno ha vecchio jQuery, allora questo "callback animazione fatto" bug è stato un brutto uno: http://bugs.jquery.com/ticket/5684 – JustAMartin

+1

Qui va il tuo numero di upvote 100 – kaiser

6

se è qualcosa che si desidera cambiare, sbiadire uno e sbiadire un altro nello stesso punto, è possibile posizionare un attributo {position: absolute} sulle div, in modo che entrambe le animazioni si giochino l'una sull'altra e non devi aspettare che un'animazione finisca prima di iniziare il prossimo.

157

Con jQuery 1.6 versione è possibile utilizzare il metodo .promise().

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

Questo è ridondante per la maggior parte delle animazioni jQuery dato che ci sono discussioni di callback sulla maggior parte dei metodi, ma usando 'promise()' o 'when()' e 'done()' puoi sfruttare un comportamento molto interessante da metodi di terze parti, o anche i tuoi. +1 per la mediazione di '.promise()'! – stuartc

+2

Ottima soluzione! –

+4

Non ho sentito prima, mi sono appena salvato il sedere. – prismspecs

9

È possibile anche utilizzare $.when() aspettare fino alla promise finito:

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

Nel caso in cui si sta facendo una richiesta che potrebbe pure fallire, allora si può anche fare un passo avanti:

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

Questa parte di questa risposta che usa '$ .when()' non funziona perché 'myEvent()' non restituisce una promessa e '$.quando() 'si aspetta che tu gli passi una o più promesse perché faccia il suo lavoro. – jfriend00

Problemi correlati