2011-01-13 7 views
5

Estoy intentando recorrer un conjunto de etiquetas div y fundirlas una por una. Hasta ahora, usando el operador .each(), los hace todos a la vez. ¿Cómo se usa .each() como un clásico para cada ciclo?JQuery usando cada uno() como clásico para cada ciclo y no todos a la vez

Aquí está mi fragmento de código JQuery y actualmente desvanece todas las etiquetas div, una por una.

$("document").ready(function() { 
// all div tags are hidden at start 

    $(".myclass").each(function (i) { 
     var $div = $(this); 
     showDiv($div); 
     hideDiv($div); 
}); 

function showDiv(theDiv) 
{ 
     $(theDiv).fadeIn(4000); 
} 

function hideDiv(theDiv) 
{ 
     $(theDiv).fadeOut(4000); 
}  
}); 

Gracias por considerar la cuestión,

+0

¿Qué es un "clásico para cada bucle"? Esto tiene que ver con los tiempos de espera. Estás llamando a show, y luego lo ocultas, no hay ningún retraso entre. –

+0

> clásico para cada ciclo "No supe cómo decirlo. Gracias de nuevo. – omaether

Respuesta

2

No se trata de utilizar .each() frente a un bucle sencillo for. El problema es que las animaciones se manejan a través de tiempos de espera (administrados por jQuery). Las llamadas a .fadeIn() y .fadeOut() devuelven inmediatamente, antes de que las animaciones hayan tenido lugar.

Se podría añadir algo de retraso a cada fadeIn(), o se podría estructurar su código diferente:

$("document").ready(function() { 
    var divs = $('.myclass'), i = 0; 
    function reveal() { 
    if (i === divs.length) return; 
    divs.eq(i).fadeIn(4000, function() { 
     divs.eq(i).fadeOut(4000, function() { 
     i++; 
     setTimeout(reveal, 0); 
     }); 
    }); 
    } 
    setTimeout(reveal, 0); 
}); 
+0

Muy bien, gracias por mostrarle al operador .eq(), y usarlo como una matriz indexada. Muy apreciada. – omaether

1

Uso de retardo:

var delay = 0; 
$(".myclass").each(function (i) { 
    var $div = $(this); 
    showDiv($div); 
    hideDiv($div, delay); 
    delay += 100; 
}); 


function hideDiv(theDiv, delay) 
{ 
    $(theDiv).fadeOut(4000).delay(delay); 
} 
+0

gracias. Agregué .delay en la cadena jQuery también. Muy útil. Sí, estoy trabajando en una versión más concisa como esa. – omaether

+0

No hay problema. Entonces, si utilizó mi solución, podría nominarla como respuesta para que otros que lean la pregunta lean esta respuesta primero. – Aliostad

1

Su función .each funciona como se esperaba. Lo que no funciona como se espera es el hecho de que Javascript es de naturaleza asincrónica. No espera a que se complete el showDiv antes de llamar al hideDiv nuevamente. Las llamadas comienzan a entrar en conflicto entre ellas.

En su lugar, lo que desea utilizar es un intervalo que no es realmente una parte de jQuery en sí, sino que se basa en Javascript.

Algo como esto:

function showHide(theDiv) { 
    if($(theDiv).is(":visible")) { 
      $(theDiv).fadeOut(4000); 
    } 
    else { 
      $(theDiv).fadeIn(4000); 
    } 
} 

setInterval(function() { showHide("#theDivsID") }, 4100); 
+0

Sí. Este aspecto de anidación de jQuery (y javascript) tiene más sentido a la luz de su comentario asincrónico. Gracias. – omaether

Cuestiones relacionadas