4 Stimmen

In jQuery, wenn Sie ein Element entfernen, werden alle Ereignisse auf sie entfernt werden?

Wenn ich zum Beispiel einen Link mit dem folgenden Ereignis verknüpft habe:

$("a.d").bind("click", this, onDelete);

Und später tun:

$("a.d").remove();

Ist das in Ordnung? Oder verursacht es ein Speicherleck und ich muss unbind 1st aufrufen?

Danke für jede Hilfe.

6voto

code_burgar Punkte 11551

Aus den jQuery-Dokumenten für remove()

Entfernt alle übereinstimmenden Elemente aus der DOM. Dies entfernt sie NICHT aus dem jQuery-Objekt entfernt, so dass Sie die die übereinstimmenden Elemente weiter zu verwenden. Hinweis dass diese Funktion ab 1.2.2 auch alle Event-Handler und intern zwischengespeicherte Daten entfernt.

4voto

philnash Punkte 63011

Ich habe es nicht getestet, aber ich glaube, dass das Entfernen eines Elements die Bindung seiner Event-Handler aufheben wird. Zu dieser Schlussfolgerung komme ich durch die jQuery-API-Dokumentation (Suche nach remove), die besagt, dass, wenn Sie ein Element von einem Teil des DOM in einen anderen verschieben wollen, dass:

$("#foo").remove().appendTo("#bar");

sollte geschrieben werden als

$("#foo").appendTo("#bar");

um zu vermeiden, dass die Ereignisbehandler verloren gehen.

0voto

Lucavai Punkte 101

Die Antwort lautet ja, sofern das Ereignis MIT jQuery angehängt wurde. Wenn mit etwas wie "onclick" angehängt glaube ich nicht, dass es wird.

Dieser Artikel befasst sich mit einigen dieser Fragen. Er definiert auch eine rekursive Funktion zum Entfernen aller Klick-Ereignisse für ein Element und alle seine Kinder. Er deckt sowohl jQuery-Klick-Handler als auch Handler ab, die mit onclick definiert sind, so dass Sie abgedeckt sind.

http://www.computerhowtoguy.com/how-to-use-the-jquery-unbind-method-on-all-child-elements/

function RecursiveUnbind($jElement) {
    // remove this element's and all of its children's click events
    $jElement.unbind();
    $jElement.removeAttr('onclick');
    $jElement.children().each(function () {
        RecursiveUnbind($(this));
    });
}

Um die Funktion im vorherigen Beispiel zu verwenden, würden wir die Funktion aufrufen und ihr das "container"-Div als jQuery-Objekt übergeben.

RecursiveUnbind($('#container'));

-2voto

jrharshath Punkte 24857

Für das Protokoll, müssen Sie nicht über Speicherlecks in Javascript zu kümmern. (chill man, nicht c++!)

Die Javascript-Engine des Browsers verwaltet alle Objekte und sammelt sie in den Müll. Wenn ich von Objekten spreche, sind damit auch Event-Handling-Funktionen gemeint, denn Funktionen sind auch Objekte in Javascript.

Unverwandt: Ich liebe es, wie alles ein Objekt in Javascript ist :D

Zum Wohl!
jrh

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X