2013-09-26 4 views
5

wenn i Ereignisbehandlungsroutine auf ein beliebiges Element in JavaScript wieEreignisbehandler JavaScript-nach-Knoten Entfernen

var link = document.createElement("a"); 

document.body.appendChild(link); 


link.addEventListner("click",function(){ 

    alert("do something"); 

}); 

hinzufügen und i den Link dann entfernen

link.parrentNode.removeChild(link); 

was ist dann Ereignis, dass ich zu verbinden befestigt Es wird auch entfernt oder wird es im Speicher bleiben (ein bisschen verwirrt, wie Ereignis im Speicher und für wie lange gespeichert werden) oder sollte ich zuerst den Event-Handler entfernen und dann entfernen ich den Link-Knoten.

+0

Sie hängen keine Ereignisse an, Sie fügen einen Listener für ein Ereignis hinzu (daher der Name der Methode). Der Listener existiert nur so lange, wie das Objekt (DOM-Element), an das er angehängt ist, existiert. – RobG

Antwort

1

In JavaScript-Funktion Ausdrücke (in Ihrem Fall Ereignisbindung) ein Objekt zuweisen und damit den Speicher verbraucht. Sie sollten es entfernen oder richtig behandeln. Überprüfen Sie diesen Link, der die Speicherverwaltung im Detail erklärt.

Js Memory Management

prüfen Garbage-Collection-Seite.

3

Fast alle Browser entfernen den Ereignishandler aus dem Speicher, wenn der Garbage Collector aufgerufen wird. IE6 und darunter haben jedoch einen bekannten Fehler, der dazu führen kann, dass der Ereignishandler nicht durch Garbage Collection verursacht wird, wodurch die Seite Speicher verliert.

Es wurde als gute Praxis angesehen, Event-Handler vor dem Entfernen eines Elements zu bereinigen (Bibliotheken wie YUI und JQuery haben Funktionen dafür). Aber heutzutage würde ich sagen, dass Sie sich nur darum sorgen müssen, wenn Sie sich für IE6 interessieren.


Hinweis: Falls Sie sich über den Fehler wundern. Es ist aufgrund der Tatsache, dass IE Garbage Collector kann nicht umgehen zirkuläre Referenzen, wenn es das DOM beteiligt ist (auf älteren IE konnte es nicht umgehen Zirkelbezüge, auch wenn es nicht das DOM beteiligt).

So zum Beispiel, wenn Sie Code wie diese:

myDiv.onclick = function() { myDiv.style.backgroundColor = 'red' } 
//        ^
//        | 
//      circular reference 

dann IE6 und unten konnten die Event-Handler befreien. Aber wenn Ihr Event-Handler keinen Zirkelverweis auf das DOM-Objekt enthält, an das er angehängt ist, wird der IE ihn abräumen.

+0

Link zu einer verwandten Frage: http://stackoverflow.com/questions/10092619/precise-explanation-of-avascript-dom-circular-reference-issue – slebetman

+0

IE 6 und 7 unterstützen * addEventListener * sowieso nicht, also in In diesem Fall werden sie nur einen Fehler werfen. ;-) – RobG

Verwandte Themen