У меня затруднительное положение: я хочу отправить некоторые данные с помощью прослушивателя событий, но также могу удалить прослушиватель. Вот стандартный подход к закрытию ...
var fn = function(e){method(e,data)};
el.addEventListener('click',fn,false);
el.removeEventListener('click',fn,false);
и вы можете удалить событие, просто отлично. Но скажите, элемент был удален из DOM? Тогда у вас останется функция fn
. После удаления нескольких тысяч элементов DOM это приведет к утечке памяти.
Я рассмотрел присоединение обработчика событий DOMNodeRemoved, который удалял бы любые оставшиеся функции / данные вместе с удаленным узлом. Но, очевидно, это событие не совместимо с разными браузерами.
Единственный другой вариант, который я придумал, - это изменение DOM элемента. Рассмотрим ...
el.MyEventData = function(e){method(e,data)};
el.addEventListener('click',el.MyEventData,false);
el.removeEventListener('click',el.MyEventData,false);
Допустимо ли изменение DOM в этой ситуации? Единственная неприятная часть этого решения - когда вы пытаетесь добавить более одного прослушивателя событий. Допустим, мы создали специальную функцию для анализа добавления / удаления событий ...
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;
}
}
}
Он по-прежнему модифицирует DOM, как и раньше, и, конечно, тоже не очень элегантное решение. Кто-нибудь знает какой-либо альтернативный, лучший способ передачи данных?
РЕДАКТИРОВАТЬ : Итак, я посмотрел немного сценариев данных / событий jQuery. Я не совсем понимаю код, поэтому, если кто-то уточнит, это будет полезно. Но кажется, что они используют похожий метод, создавая некоторый тип свойства el.cache, который содержит данные о событиях.