2010-05-24 12 views
6

Durante l'animazione in jQuery, qual è la procedura migliore per attivare una richiamata solo quando TUTTI gli elementi sono animati e non per ogni elemento?Durante l'animazione, come si attiva la richiamata solo quando tutti gli elementi sono completati?

Ad esempio:

$('.someElements').fadeOut('fast', function() { 
    // dont do this until ALL elements are done fading 
} 
+0

Sono confuso sulla tua domanda? Tutti questi elementi dovrebbero terminare la loro animazione allo stesso tempo. Tutti ottengono la durata di 'veloce', quindi finiscono tutti allo stesso tempo. – Tejs

+0

Vuoi attivare solo la richiamata ** una volta **? –

+0

Tejs: Come Giustino menziona di seguito, un callback scatterà per ogni elemento della collezione. E Felix, sì, voglio solo richiamare una volta la richiamata. Ho deciso di andare con la risposta di microspino qui sotto. –

risposta

4

Questo potrebbe essere un frammento di provare:

var numberOfElements = $('.someElements').length; 

$('.someElements').fadeOut(fast, function() { 
    if(numberOfElements-- > 0) return; 
    alert('call the Fireman!'); 
}); 

L'avviso è solo un segnaposto fino alla fine -callback hai bisogno di sparare.

EDIT (un altro modo):

È anche possibile prendere tutti gli elementi ma non l'ultima uno.

$('.someElements').not(.someElements:last).fadeOut(); 

e quindi aggiungere un fadeOut con richiamata solo per E

$('.someElements:last').fadeOut(fast, function(){ 
    // do something, it's the end of the world 
}; 
+1

Ottimo! Ma, per fare in modo che il confronto diventi vero, la condizione dovrebbe essere (--numberOfElements> 0) giusta? Per diminuire la variabile prima del confronto. –

+0

- è un operatore LeftHandSideExp.L'espressione diminuisce prima, quindi valuta il confronto. Dì che sei sull'ultimo ciclo: hai 1 elemento, l'espressione va in questo modo: 1--> 0? Falso, non tornare, passare alla riga successiva e attivare la chiamata di avviso. – microspino

+1

Perché funzioni, la condizione dovrebbe essere (--numeroOggetti> 0) – aghoshx

2

Questa è una grande domanda, come da jQuery docs:

Se più elementi sono animati, è importante notare che il callback viene eseguita una volta per corrispondenza elemento, non una sola volta per l'animazione nel suo insieme.

Per aggirare questa limitazione si potrebbe:

  • enumerare tutti gli elementi corrispondenti .someElements, e impostare una richiamata separata per ciascuno di essi.
  • Avere una variabile count che tiene traccia di quanti callback totali ci sono.
  • Nella tua callback, Decremento count fino a raggiungere 0.

Quando il conteggio arriva a 0, tutte le richiamate sono completi, e vi sarà garantito che tutti gli elementi sono fatto l'animazione. Da qui, è possibile avere il codice speciale nella vostra callback che fa tutto quello che devi fare ...

+0

Grazie Justin! Questo sembra un po 'elaborato se vuoi solo richiamare il callback una volta, ma è ottimo per quando hai bisogno che accada qualcosa anche per ogni animazione. Per questo caso più semplice, mi piacerebbe andare con la risposta di microspino, però. –

0

più recenti release di jQuery (versione 1.6 e successive) includono l'idea di una promise. L'utilizzo di questa funzione elimina la necessità di una soluzione alternativa. Ad esempio:

// define the animation on many elements 
$('.someElements').fadeOut('fast'); 

// define the promise that is called once all element animations are done 
$('.someElements').promise().done(function() { 
    // put callback actions here 
}); 
Problemi correlati