2010-01-30 19 views
8

Estoy tratando de hacer un div fade in/out que esté dentro de cada sentencia. El problema es que se llama al siguiente elemento antes de que se complete el fundido de entrada/salida.espere cada 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> 

consola muestra -

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

me gustaría algo así como -

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

Entonces, ¿cómo puedo esperar que para cada 'uno' para ser completamente terminado antes de pasar a el siguiente valor?

Respuesta

7

Tendrás que usar devoluciones de llamada: funciones que se ejecutan cuando la función actual finaliza. Para hacer esto con .fadeOut puede hacer:

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

myFunction no se llamaría hasta fadeOut se completó. Las llamadas AJAX con $ .get también pueden tener funciones de devolución de llamada.

Aquí hay un ejemplo que funciona, aunque estoy seguro de que hay una mejor manera:

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

y luego en su document.ready que se dice:

animate(theArray); 
1

Parece que está intentando "pasar por el ciclo" a través de una lista de divisiones. ¿Has comprobado el jQuery Cycle plugin?

+0

bien, esto es sólo un ejemplo sencillo. Es posible que desee hacer llamadas ajax con los valores de la matriz, llamar a otras funciones que hacen otras cosas, o alguna otra cosa. Hice lo siguiente para mostrar un ejemplo simple de cómo hacer que cada elemento espere a que el anterior termine por completo. – scott

1

¿Qué hay de esto, animar pasando por cada elemento en la matriz dentro de la función?

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

incluso se puede bucle de nuevo al comienzo si quieren:

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

Esta es una respuesta más completa al ejemplo exacto publicado que el mío; aunque en mi defensa estaba tratando de mantenerlo como un simple ejemplo de recursión, como mi comentario aquí: http://stackoverflow.com/questions/2168485/wait-for-each-jquery – Erik

+0

El suyo es un ejemplo más simple, y algunas veces eso puede ser beneficioso (más fácil de entender, depende de lo que quieras hacer) – SamWM