2010-06-24 15 views
30

anhängen I Inhalt auf eine Liste am anhängt mit:JQuery - Führen Sie nach dem Rückruf

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

ich weitere Funktionen auf die beigefügte Inhalt ausführen möchten (ändern Klasse gelten Animationen usw.)

Wie kann ich einen Callback für diese Funktion ausführen, mit dem ich Funktionen für die angehängten Daten ausführen kann?

Antwort

26

jQuery .each() ist nimmt eine Rückruffunktion und wendet sie auf jedes Element in dem Objekt jQuery.

etwas wie folgt vorstellen:

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

Sie können auch das Ergebnis nur speichern und arbeiten daran statt:

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

ich auch, dass stattdessen vorschlagen würde, wie die CSS von mofiying, dass Sie nur Fügen Sie eine Klasse zu Ihrer geklonten li wie folgt hinzu:

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

Dann richten Sie einige Stile wie:

+0

Hmm .. das 2. Beispiel würde immer noch asynchron abfeuern und würde in den meisten Fällen nicht funktionieren, wenn sie den Callback * nach dem * appendTo benötigen – Trip

+0

Ich bin mir nicht sicher, Sie verstehen, was asynch bedeutet @Trip --- All das Code oben ist synch. In diesem Code gibt es keine asynchronen Aufrufe. Auch der Rückruf innerhalb der einzelnen ist noch synchron, es wird sofort aufgerufen. Der einzige Unterschied in beiden Beispielen besteht darin, dass der erste einen neuen Bereich in jedem Bereich erstellt, in dem Sie Variablen für jedes angepasste Element speichern können, andernfalls sollten sie identisch funktionieren. – gnarf

+1

Ich habe mich geirrt! Danke :) – Trip

4

Sie können einfach weitere Operationen am Semikolon verketten.

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

etc

+2

Wie würde ich dies in eine Kette implementieren. $ (this) .find ('h5') entfernen(); \t \t \t $ (this) .find ('img'). Css ('Höhe', '40px', 'Breite', '40px'); \t \t \t $ (this) .find ('li'). Css ('Höhe', '60px', 'Breite', '40px'); – user342391

+1

Das hilft nicht, die Frage ist, wie Sie einen Rückruf anwenden können, nachdem die Append-Operation ausgeführt wurde. DOM-Vorgänge werden asynchron ausgeführt. Im nächsten Teil der Kette ist der angehängte Inhalt noch nicht sichtbar. – douwe

16

Leider ist das Hinzufügen von Rückrufen zu Dom-Operationen nicht etwas, das in einer ordentlichen Art und Weise mit Javascript getan werden kann. Aus diesem Grund ist es nicht in der jQuery-Bibliothek. Ein settimeout mit dem Timer "1ms" setzt die Funktion jedoch immer in das settimeout am unteren Ende des Callstacks. Das funktioniert! Die Bibliothek "underscore.js" verwendet diese Technik in _defer, was genau Ihren Vorstellungen entspricht.

$('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 Operationen sind synchronisiert, es gibt keinen Grund, '_defer' irgendetwas – gnarf

+0

Danke, das ist genau das, was ich brauchte! Mein Fall bestand darin, die html-Entität an einen Container anzuhängen, als ein Ereignis an sie zu binden. Habe gekämpft, um es für eine Weile zu arbeiten ... –

+0

Awesome! Nicht die naheliegendste Lösung, der ich begegnet bin, aber es funktioniert :-) – bestprogrammerintheworld