2013-09-26 12 views
5

jeśli dodać obsługi zdarzeń na dowolnym elemencie w javascript jakjavascript event handler po usunięciu węzła

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

document.body.appendChild(link); 


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

    alert("do something"); 

}); 

a następnie usunąć link

link.parrentNode.removeChild(link); 

następnie co o wydarzeniu, że dołączony do linku to również zostanie usunięte lub pozostanie w pamięci (trochę mylone z tym, jak zdarzenie jest przechowywane w pamięci i na jak długo) lub powinienem najpierw usunąć program obsługi zdarzeń, a następnie usunąć węzeł łącza.

+0

Nie dołączasz zdarzeń, załączasz detektor zdarzenia (stąd nazwa metody). Słuchacz istnieje tylko tak długo, jak długo istnieje obiekt (element DOM), do którego jest przyłączony. – RobG

Odpowiedz

1

W wyrażeniach funkcji javascript (w twoim zdarzeniu przypadku sprawy) przydziela obiekt, a tym samym zużywa pamięć. Powinieneś go odpowiednio usunąć lub obsłużyć. Sprawdź ten link, który szczegółowo wyjaśnia zarządzanie pamięcią.

Js Memory Management

Sprawdź sekcja zbieranie śmieci.

3

Prawie wszystkie przeglądarki usuwają procedurę obsługi zdarzeń z pamięci, gdy wywoływacz nie jest wywoływany. Jednak IE6 i poniżej ma znany błąd, który może spowodować, że program obsługi zdarzeń nie będzie zbierać śmieci, powodując wyciek pamięci.

Uważa się, że dobrą praktyką jest czyszczenie procedur obsługi zdarzeń przed usunięciem elementu (w rzeczywistości biblioteki takie jak YUI i JQuery mają do tego funkcje). Ale obecnie powiem tylko, że martwią się tym, jeśli zależy ci na IE6.


Uwaga: w przypadku, gdy zastanawiasz się nad błędem. Wynika to z tego, że odśmiecacz IE nie był w stanie obsłużyć odwołań cyklicznych, jeśli dotyczy to DOM (w starszych wersjach IE nie mógł obsługiwać odwołań cyklicznych, nawet jeśli nie obejmował DOM).

Tak na przykład, jeśli masz kodu:

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

następnie IE6 i poniżej nie może uwolnić obsługi zdarzeń. Ale jeśli twój program obsługi zdarzeń nie zawiera żadnych odwołań cyklicznych do obiektu DOM, do którego jest dołączony, wówczas IE będzie je zbierał.

+0

Link do pokrewnego pytania: http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

IE 6 i 7 nie obsługują * addEventListener * w każdym razie, więc w w tym przypadku po prostu rzucają błąd. ;-) – RobG

Powiązane problemy