2010-01-30 24 views
8

Ich versuche, ein div Ein-/Ausblenden, die innerhalb einer jeder Aussage ist. Das Problem ist, dass das nächste Element aufgerufen wird, bevor das Ein-/Ausblenden abgeschlossen ist.warten auf jede jQuery

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

Konsole zeigt -

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

Ich möchte so etwas wie -

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

Wie kann ich also für jeden 'jeweils' warten sein vollständig, bevor sie fertig der nächste Wert?

Antwort

7

Sie müssen Callbacks verwenden - Funktionen, die ausgeführt werden, wenn die aktuelle Funktion beendet ist. Um dies zu tun mit .fadeOut würden Sie tun:

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

myFunction nicht aufgerufen werden würde, bis fadeOut abgeschlossen wurde. AJAX-Aufrufe mit $ .get können auch Rückruffunktionen haben.

Hier ist ein Beispiel, das, obwohl ich bin sicher, dass es eine bessere Art und Weise funktioniert:

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); }); 
} 

und dann in Ihrem document.ready Sie würden rufen:

animate(theArray); 
1

Klingt so, als würden Sie versuchen, durch eine Liste von divs zu "radeln". Haben Sie die jQuery Cycle plugin ausgecheckt?

+0

gut, das ist nur ein einfaches Beispiel. Ich möchte vielleicht Ajax-Aufrufe mit den Werten im Array machen, andere Funktionen aufrufen, die andere Dinge tun, oder etwas anderes. Ich machte folgendes, um ein einfaches Beispiel zu zeigen, wie man jeden Gegenstand auf den vorherigen warten lassen kann. – scott

1

Wie wäre es damit, animieren, indem Sie alle Elemente im Array innerhalb der Funktion durchlaufen?

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'); 
    }); 
} 

Sie können sogar Schleife zurück zum Start, wenn Sie wollen:

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

Dies ist eine vollständigere Antwort auf das genaue Beispiel, das dann meins gepostet wird; obwohl ich zu meiner Verteidigung versuchte, es ein einfaches Beispiel der Rekursion zu halten, wie mein Kommentar hier: http://stackoverflow.com/questions/2168485/wait-for-each-jquery – Erik

+0

Ihr ist ein einfacheres Beispiel, und manchmal das kann nützlich sein (leichter zu verstehen, hängt davon ab, was Sie tun möchten) – SamWM