Я по поводу статьи
http://javascript.ru/tutorial/events/crossbrowser
Что если мне
очень не хочется навешивать на функции guid?
Я придумал такой способ. Для каждого типа события создается свой кэш.
// 1.
elem.events[type] = {}
// заменяем на
elem.events[type] = new Cache()
// 2.
handler.guid = ++guid
elem.events[type][handler.guid] = handler
// заменяем на
elem.events[type].add(handler)
// 3.
var handlers = this.events[event.type]
// заменяем на
var handlers = this.events[event.type].getObjects()
// 4.
delete handlers[handler.guid]
// заменяем на
handlers.remove(handler)
Я описал основные моменты. В деталях изменений будет немного больше.
Примерный набросок кэша в листинге ниже.
function Cache() {
var nextGUId = 1, // нумерация начинается с 1
innerCache = {}; // собственно кэш
// Получить внутренний guid объекта
function getGUId(obj) {
for(var guid in innerCache) {
if(innerCache[guid] === obj) {
return guid;
}
}
return 0;
}
// Добавить объект в кэш
this.add = function(obj) {
if(!getGUId(obj)) {
innerCache[nextGUId++] = obj;
}
}
// Удалить объект из кэша
this.remove = function(obj) {
var guid = getGUId(obj);
if(guid) {
delete innerCache[guid];
}
}
// Составить обычный массив из кэша
this.getObjects = function() {
var arr = [];
for(var guid in innerCache) arr.push(innerCache[guid]);
return arr;
}
}
Аналогично можно избавиться от добавление в элементы DOM events и handle. Для этого надо немного доработать кэш, добавить возможность сопоставлять (прикреплять) произвольный объект к объекту в кэше.
Т.е. моей целью является осуществление добавления обработчиков событий без какого либо изменения функций и объектов.
Соответственно хотелось бы узнать ваше мнение и комментарии.
А может это возможно сделать гораздо проще?