2013-09-26 12 views
5

se aggiungo gestore di eventi su qualsiasi elemento in JavaScript comejavascript gestore di eventi dopo la rimozione del nodo

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

document.body.appendChild(link); 


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

    alert("do something"); 

}); 

e poi ho rimuovere il collegamento

link.parrentNode.removeChild(link); 

allora che dire di evento che ho attaccato al link è anche rimossa o rimarrà in memoria (un po 'confusa con il modo in cui l'evento viene archiviato in memoria e per quanto tempo) o dovrei prima rimuovere il gestore di eventi e quindi rimuoverò il nodo di collegamento.

+0

Non si allegano eventi, si allega un listener per un evento (da cui il nome del metodo). Il listener esiste solo finché esiste l'oggetto (elemento DOM) a cui è collegato. – RobG

risposta

1

In espressioni di funzione javascript (nel caso di associazione evento) allocare un oggetto e quindi consumare la memoria. Dovresti rimuovere o gestire correttamente. Controlla questo link che spiega in dettaglio la gestione della memoria.

Js Memory Management

Controllare la sezione di garbage collection.

3

Quasi tutti i browser rimuoveranno il gestore eventi dalla memoria quando viene richiamato il garbage collector. Tuttavia, IE6 e versioni successive presentano un bug noto che potrebbe impedire al gestore di eventi di raccogliere dati inutili causando perdite di memoria nella pagina.

Prima di rimuovere un elemento è stato considerato un buon metodo per pulire i gestori di eventi (infatti, le librerie come YUI e JQuery hanno funzioni per questo). Ma di questi tempi direi che mi preoccupo solo se ti importa di IE6.


Nota: nel caso in cui vi state chiedendo il bug. È dovuto al fatto che il garbage collector di IE non può gestire i riferimenti circolari se coinvolge il DOM (su IE precedente non è in grado di gestire riferimenti circolari anche se non ha coinvolto il DOM).

Così, per esempio, se si dispone di codice come questo:

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

quindi IE6 e al di sotto non potevano liberare il gestore di eventi. Ma se il tuo gestore di eventi non contiene alcun riferimento circolare all'oggetto DOM a cui è collegato allora IE lo raccoglierà.

+0

Link a una domanda correlata: http://stackoverflow.com/questions/10092619/precise-explanation-of-javascript-dom-circular-reference-issue – slebetman

+0

IE 6 e 7 non supportano * addEventListener * in ogni caso, quindi in In questo caso, faranno solo un errore. ;-) – RobG

Problemi correlati