2010-08-31 23 views
6

Algunos estúpida pregunta sobre DOM, por favor, no me odiesmanera correcta para evitar pérdidas de memoria en DOM detector de eventos

Para algunas razones por las que necesita para pasar una función anónima a addEventListener (principalmente a las variables de contexto "pass") pero el oyente llamado una vez puede eliminarse, así que quiero entender si el código que se muestra a continuación es la manera correcta de separar al oyente.

var item = document.createElement("div"); 
    item.addEventListener("click", function(event) { 
     // do some stuff 
     // remove listener otherwise we generate a memory leak 
     item.removeEventListener("click", arguments.callee, false); 
    }, false); 

    var menu = document.getElementById("mymenu"); // some element 
    menu.appendChild(item); 

Otra pregunta, si el menú del elemento se elimina de su elemento principal utilizando removeChild ¿el oyente se elimina automáticamente?

+0

Parece necesario, como aparece en documentos de Mozilla https://developer.mozilla.org/en/DOM /element.addEventListener#Memory_issues Tienes razón, estoy usando Firefox;) – dafi

Respuesta

6

Sé que quiere usar una función anónima, pero puede que esté mejor con una función nombrada; aún debe tener acceso a las mismas variables externas.

Tal vez esto:

var item = document.createElement("div"); 
var listener = function(event) { 
     // do some stuff 
     // remove listener otherwise we generate a memory leak 
     item.removeEventListener("click", listener, false); 
    }; 
item.addEventListener("click", listener, false); 

var menu = document.getElementById("mymenu"); // some element 
menu.appendChild(item); 

Ah, y no te odio :)

+0

Definitivamente suena más simple, gracias – dafi

Cuestiones relacionadas