Tengo una situación difícil: quiero enviar algunos datos con un detector de eventos pero también puedo eliminar el oyente. Aquí está el enfoque de cierre estándar ...Enviar datos con un detector de eventos
var fn = function(e){method(e,data)};
el.addEventListener('click',fn,false);
el.removeEventListener('click',fn,false);
y puede eliminar el evento, muy bien. Pero, por ejemplo, ¿el elemento se eliminó del DOM? Entonces, se quedaría con la función fn
sentada. Después de eliminar un par de miles de elementos DOM, dará como resultado una pérdida de memoria.
He considerado adjuntar un controlador de eventos DOMNodeRemoved, que eliminaría cualquier resto de funciones/datos junto con el nodo eliminado. Pero aparentemente, ese evento no es compatible con varios navegadores.
La única otra opción que he encontrado sería la modificación del DOM del elemento. Considere ...
el.MyEventData = function(e){method(e,data)};
el.addEventListener('click',el.MyEventData,false);
el.removeEventListener('click',el.MyEventData,false);
Está modificando el DOM aceptable en esta situación? La única parte pegajosa de esa solución es cuando intenta agregar más de un detector de eventos. Digamos que hicimos una función personalizada para analizar la adición/eliminación de los acontecimientos ...
function makeEvent(fn,data){
var dataFn = function(e){fn(e,data)};
//create object to hold all added events
el.myEvents = {};
//make ID for this specific event
var eventID = ranString();
//add the event to the events object
el.myEvents[eventID] = [fn,dataFn];
//finally add the listener
el.addEventListener('click',dataFn,false);
}
function destroyEvent(fn){
//find all fn references
for(var id in el.myEvents){
if (el.myEvents[id][0] == fn){
el.removeEventListener('click',el.myEvents[id][1],false);
el.myEvents[id] = null;
}
}
}
Todavía modifica el DOM, como antes, y desde luego no es una solución muy elegante tampoco. ¿Alguien sabe de alguna alternativa, mejor método para pasar datos?
EDIT: he examinado un poco de los guiones de datos/eventos de jQuery. No entiendo completamente el código, así que si alguien aclara, sería útil. Pero parece que usan un método similar, al crear algún tipo de propiedad el.cache, que contiene datos de eventos.
el evento jQuery se basa en la idea de [decano edward] (http://dean.edwards.name/weblog/2005/10/add-event/), es probablemente la mejor solución para usted –
He buscado su script, pero no tiene otra forma de implementar datos envío que los ejemplos que ya he enumerado. – Azmisov