2009-02-17 4 views
20

Was passiert in jQuery, wenn Sie ein Element entfernen() und an anderer Stelle anhängen()?Sind Ereignisse in jQuery verloren, wenn Sie() ein Element entfernen und an anderer Stelle anhängen()?

Es scheint, dass die Ereignisse abgehakt sind - als ob Sie nur frische HTML einfügen (was ich denke, was passiert). Aber es ist auch möglich, dass mein Code einen Fehler enthält - also wollte ich dieses Verhalten nur bestätigen, bevor ich fortfahre.

Wenn dies der Fall ist - gibt es irgendwelche einfachen Möglichkeiten, die Ereignisse auf genau diesen Teil von HTML neu zu hooken, oder eine andere Möglichkeit, das Element zu verschieben, ohne das Ereignis an erster Stelle zu verlieren.

Antwort

28

Ja, jQuery's Ansatz mit remove() ist, alles gebunden mit jQuery eigenen bind zu lösen (um Speicherlecks zu verhindern).

Wenn Sie jedoch nur etwas im DOM verschieben möchten, müssen Sie zuerst remove() es. Nur append zum Inhalt Ihres Herzens, die Ereignisbindungen wird Stick um :)

Zum Beispiel fügen Sie diese in Ihre Firebug auf dieser Seite:

$('li.wmd-button:eq(2)').click(function(){ alert('still here!') }).appendTo(document.body) 

Und jetzt scrollen Sie zum Ende der Seite und klicke auf das kleine Globy-Symbol, das jetzt unter der SO-Fußzeile vergraben ist. Sie erhalten die alert. Alles weil ich zuerst nicht auf remove aufpasste.

+0

cool. Ich hatte gehofft, dass so etwas der Fall war. yay für interaktiven stackoverflow! –

0

Verwendung jQuery1.3.1 leben() Ereignisse zu binden, und Sie werden nicht zu kümmern brauchen ..

Update: Live-Events jetzt veraltet sind, aber Sie können den gleichen Effekt von $ (document) erhalten .auf().

+0

so ja auf meine ursprüngliche Frage? was genau passiert. Ich überprüfe 'live' jetzt –

+0

auf jeden Fall gut zu wissen über live - aber ich muss vorsichtig sein, die Vorbehalte hier http://docs.jquery.com/Events/live#typefn –

+1

nicht anwendbar, wenn Sie mit arbeiten bestimmte dom-Objekte und keine Selektoren. Das war meine erste Idee. –

51

Das jQuery detach() Funktion die gleichen wie entfernen, ist() aber die Event-Handler in dem Objekt erhält, die er zurückkehrt. Wenn Sie das Objekt entfernen und es an einem anderen Ort mit allem platzieren müssen, können Sie dies einfach verwenden.

var objectWithEvents = $('#old').detach(); 
$('#new').append(objectWithEvents); 

Überprüfen Sie die API-Dokumentation hier: http://api.jquery.com/detach/

+0

Ich musste eine Reihe von Elementen sortieren, sie mit $ parent.empty() von ihren Eltern entfernen und dann die sortierte Liste der Elemente wieder an ihre Eltern anhängen. Das war die richtige Antwort für mich. Vielen Dank! – Bart

+0

danke !!! arbeite für mich. – jruzafa

Verwandte Themen