2010-06-24 21 views
30

estoy anexando contenido a una lista usando:Jquery - Realizar devolución de llamada después de anexar

$('a.ui-icon-cart').click(function(){ 
     $(this).closest('li').clone().appendTo('#cart ul'); 
    }); 

que desea llevar a cabo otras funciones que el contenido adjunto (clase cambio, aplicar animaciones, etc.)

¿Cómo puedo realizar una devolución de llamada en esta función que me permitirá realizar funciones en los datos adjuntos?

Respuesta

26

de jQuery .each() toma una función de devolución de llamada y lo aplica a cada elemento en el objeto jQuery.

Imagínese que algo como esto:

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul').each(function() { 
    $(this).find('h5').remove(); 
    $(this).find('img').css({'height':'40px', 'width':'40px'}); 
    $(this).find('li').css({'height':'60px', 'width':'40px'}); 
    }); 
}); 

También puedes, simplemente almacenar el resultado y trabajar en él en su lugar:

$('a.ui-icon-cart').click(function(){ 
    var $new = $(this).closest('li').clone().appendTo('#cart ul') 
    $new.find('h5').remove(); 
    $new.find('img').css({'height':'40px', 'width':'40px'}); 
    $new.find('li').css({'height':'60px', 'width':'40px'}); 
}); 

Me gustaría también sugieren que en lugar de mofiying la CSS como la que acaba de agregue una clase a su li clonado así:

$(this).closest('li').clone().addClass("new-item").appendTo('#cart ul'); 

Luego configure algunos estilos como:

.new-item img, .new-item li { height: 40px; width: 40px; } 
.new-item h5 { display: none } 
+0

Hmm .. el segundo ejemplo seguiría disparar de forma asíncrona y no funcionaría en la mayoría de los casos cuando necesitaban la devolución de llamada a suceder * * después de la appendTo – Trip

+0

No estoy seguro de entender lo que significa asynch @trip --- Todo lo que el código anterior es sincronización. No hay llamadas asincrónicas en este código. Incluso la devolución de llamada dentro de cada uno sigue siendo síncrona, se llama inmediatamente. La única diferencia en cualquier ejemplo es que el primero crea un nuevo ámbito en el que cada uno puede tener para almacenar las variables para cada elemento coincidente, de lo contrario, deben trabajar de forma idéntica. – gnarf

+1

¡Estaba equivocado! Gracias :) – Trip

4

Puede seguir encadenando otras operaciones en el punto y coma.

$(this).closest('li').clone().appendTo('#cart ul').addClass('busy').fade('fast'); 

etc

+2

¿Cómo podría aplicar esto en una cadena:. $ (este) .find ('H5') eliminar(); \t \t \t $ (this) .find ('img'). Css ('height', '40px', 'width', '40px'); \t \t \t $ (this) .find ('li'). Css ('height', '60px', 'width', '40px'); – user342391

+1

Esto no ayuda, la pregunta es cómo puede aplicar una devolución de llamada después de realizar la operación de adición. Las operaciones DOM se realizan de forma asíncrona. Por lo tanto, en la siguiente parte de la cadena, el contenido adjunto aún no está visible. – douwe

16

Desafortunadamente, la adición de devoluciones de llamadas a las operaciones dom no es algo que se puede hacer de una manera ordenada mediante javascript. Por esta razón, no está en la biblioteca jQuery. Sin embargo, un settimeout con el temporizador "1ms" siempre pone la función en el settimeout en la parte inferior de la pila de llamadas. ¡Esto funciona! La biblioteca underscore.js usa esta técnica en _.defer, que hace exactamente lo que usted quiere.

$('a.ui-icon-cart').click(function(){ 
    $(this).closest('li').clone().appendTo('#cart ul'); 
    setTimeout(function() { 
     // The LI is now appended to #cart UL and you can mess around with it. 
    }, 1); 
}); 
+2

DOM Las operaciones son sincronizadas, no hay ninguna razón para '_.defer' nada – gnarf

+0

¡Gracias, eso es exactamente lo que necesitaba! Mi caso era agregar una entidad html a un contenedor, que vincular un evento. He estado luchando para que funcione por un tiempo ... –

+0

¡Impresionante! No es la solución más obvia que me he encontrado, pero funciona :-) – bestprogrammerintheworld

Cuestiones relacionadas