2010-01-30 11 views
8

Sto provando a fare una dissolvenza in entrata e in uscita all'interno di ciascuna istruzione. Il problema è che il prossimo oggetto viene chiamato prima che la dissolvenza in entrata/uscita sia completa.attendi ogni jQuery

console
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script> 

<div id='one'>one</div> 
<div id='two'>two</div> 
<div id='three'>three</div> 

<script> 
$.each([ "one", "two", "three"], function() { 
    console.log('start - ' + this); 
    animate(this); 
    console.log('end - ' + this); 
}); 

function animate(id) 
{ 
    box = '#' + id; 

    $(box).fadeOut(500, function() 
    { 

    console.log('showing - ' + id); 
    $(box).fadeIn(500); 
    $(box).css('backgroundColor','white'); 

    }); 

} 
</script> 

mostra -

start - one 
end - one 
start - two 
end - two 
start - three 
end - three 
showing - one 
showing - two 
showing - three 

vorrei qualcosa di simile -

start - one 
showing - one 
end - one 
start - two 
showing - two 
end - two 
start - three 
showing - three 
end - three 

Così come vedo l'ora per ogni 'ogni' essere completamente finito prima di passare alla il prossimo valore?

risposta

7

È necessario utilizzare i callback, funzioni che vengono eseguite al termine della funzione corrente. Per fare questo con .fadeOut si dovrebbe fare:

$('#element').fadeOut(400, myFunction); 

myFunction non sarebbe stato chiamato fino fadeOut è stata completata. Le chiamate AJAX con $ .get possono anche avere funzioni di callback.

Ecco un esempio che funziona, anche se sono sicuro che c'è un modo migliore:

function animate(myArray, start_index) { 

    // Stealing this line from Sam, who posted below. 
    if(!start_index) start_index = 0; 

    next_index = start_index+1; 
    if(next_index > myArray.length) { return; } 

    box = '#' + myArray[start_index]; 
    $(box).fadeOut(500, function() { animate(myArray,next_index); }); 
} 

e poi nel vostro document.ready si chiamerebbe:

animate(theArray); 
1

Sembra che tu stia cercando di "ciclare" attraverso un elenco di div. Hai controllato lo jQuery Cycle plugin?

+0

bene, questo è solo un semplice esempio. Potrei voler effettuare chiamate jax con i valori dell'array, chiamare altre funzioni che fanno altre cose o qualcos'altro. Ho fatto quanto segue per mostrare un semplice esempio di come ottenere che ogni elemento attenda che il precedente sia completamente finito. – scott

1

Come su questo, animare passando attraverso ogni elemento dell'array all'interno della funzione?

var elements = [ "one", "two", "three"]; 
animate(elements); 

function animate(elements, index) 
{ 
    if(!index) index = 0; 
    var box = '#' + elements[index]; 
    var $$box = $("#box"); 
    console.log('start - ' + elements[index]); 
    $$box.fadeOut(500, function() 
    { 
     console.log('showing - ' + elements[index]); 
     $$box.fadeIn(500, function() { 
      console.log('end - ' + elements[index]); 
      if(elements[++index]) animate(elements, index); 
     }).css('backgroundColor','white'); 
    }); 
} 

si può anche ciclo di nuovo alla partenza se si vuole:

var elements = [ "one", "two", "three"]; 
animate(elements); 

function animate(elements, index) 
{ 
    if(!index) index = 0; 
    var box = '#' + elements[index]; 
    var $$box = $(box); 
    console.log('start - ' + elements[index]); 
    $$box.fadeOut(500, function() 
    { 
     console.log('showing - ' + elements[index]); 
     $$box.fadeIn(500, function() { 
      $$box.css('backgroundColor','white'); 
      console.log('end - ' + elements[index]); 
      // go to next element, or first element if at end 
      index = ++index % (elements.length); 
      animate(elements, index); 
     }); 
    }).css('backgroundColor', 'aqua'); 
} 
+0

Questa è una risposta più completa all'esempio esatto pubblicato dopo il mio; sebbene nella mia difesa stavo cercando di mantenere un semplice esempio di ricorsione, come il mio commento qui: http://stackoverflow.com/questions/2168485/wait-for-each-jquery – Erik

+0

Il tuo è un esempio più semplice, ea volte quello può essere utile (più facile da capire, dipende da cosa vuoi fare) – SamWM