/ / Wenn Sie in jQuery ein Element entfernen, werden alle darauf befindlichen Ereignisse entfernt? - jquery, event-binding

Wenn Sie in jQuery ein Element entfernen, werden alle darin enthaltenen Ereignisse entfernt. - jquery, event-binding

Zum Beispiel, wenn ich eine Verbindung mit dem folgenden Ereignis habe, das daran gebunden ist:

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

Und später:

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

Ist das gut? Oder verursacht es ein Speicherleck und ich muss zuerst die Verbindung lösen?

Danke für jede Hilfe.

Antworten:

4 für die Antwort № 1

Ich habe es nicht getestet, aber ich glaube, dass das Entfernen eines Elements seine Event-Handler lösen wird. Ich komme zu dieser Schlussfolgerung aus der jQuery-API-Dokumentation (Suche nach remove), die besagt, dass wenn Sie ein Element von einem Teil des DOM zu einem anderen verschieben möchten:

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

sollte als geschrieben werden

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

um zu vermeiden, dass die Ereignishandler verloren gehen.


6 für die Antwort № 2

Von jQuery-Dokumenten für remove ()

Entfernt alle übereinstimmenden Elemente aus dem DOM. Dies entfernt sie NICHT von das jQuery-Objekt, das Sie verwenden können die passenden Elemente weiter. Hinweis dass diese Funktion ab 1.2.2 Entfernt auch alle Event-Handler und intern zwischengespeicherte Daten.


0 für die Antwort № 3

Die Antwort ist ja, solange das Ereignis WITH jQuery angehängt wurde. Wenn ich mit etwas wie "onclick" verbunden bin, glaube ich nicht, dass es das wird.

Dieser Artikel beschreibt einige davon. Außerdem definiert es eine rekursive Funktion, um alle Klickereignisse für ein Element und alle untergeordneten Elemente zu entfernen. Es wird sowohl jQuery-Klickhandler als auch mit onclick definierte Handler behandeln, 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, die das "Container" -Div als ein jQuery-Objekt übergibt.

RecursiveUnbind($("#container"));

-2 für die Antwort № 4

Zur Erinnerung, Sie müssen sich keine Gedanken über Speicherlecks in Javascript machen. (Chill Mann, nicht C ++!)

Die JavaScript-Engine des Browsers verwaltet alle Objekte, und Müll sammelt sie. Wenn ich Objekte sage, bedeutet das auch Ereignisbehandlungsfunktionen, weil Funktionen auch Objekte in Javascript sind.

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

Prost!
jrh