Про добавление события и не только
Я по поводу статьи 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. Для этого надо немного доработать кэш, добавить возможность сопоставлять (прикреплять) произвольный объект к объекту в кэше. Т.е. моей целью является осуществление добавления обработчиков событий без какого либо изменения функций и объектов. Соответственно хотелось бы узнать ваше мнение и комментарии. А может это возможно сделать гораздо проще? |
Цитата:
а отрефакторить тот код с видимым результатом, думаю, можно а еще можно подумать, нужно ли удаление обработчиков событий |
Цитата:
В первую очередь нужно разобраться, а надо ли выдумывать свой addEventListener поверх нативного. |
Цитата:
|
А еще про guid. Идея хорошая. ток навешивать его можно на новые функции созданные динамически иначе будет баг. А если есть уже готовая функция скомпилированная, нужная только для обработки нескольких обьектов?
function abc(){alert(1)} function test1(){ var a = abc; a.guid=1; } function test2(){ var a=abc; alert(a.guid); //1 а это баг } test1(); test2(); выходом из этой ситуации - делать мост между обьектом и функцией. Навешивать на функцию И обьект id=guid++ object={} // обьект DOM function abc(){alert(1)} guid=0; function test1(obj,fn){ obj.fns = obj.fns||{}; obj.fns[guid]=fn; fn.objs = fn.objs||{} fn.objs[guid]=obj; return guid++; } function test2(num){ var a=abc; alert(a.objs[num]); //object верно } test2(id=test1(object,abc)); alert(object.fns[id]); //function abc(); |
Если честно, не очень понял вашу мысль.
Какую роль здесь играют функции test1 и test2? abc() - это обработчик события, как я понимаю. |
PeaceCoder, проблемы будут, если попытаться навесить одну функцию дважда тому же самому элементу, на то же самое событие
|
Цитата:
abc это да обработчик. Цитата:
|
Цитата:
|
Цитата:
Попробуй через guid повесить несколько обьектов на ГОТОВУЮ функцию, а потом unbind этой функции с любого обьекта. Если непонял о чем я, то при unbind этой функции она перестанет работать на всех обьектах. |
Часовой пояс GMT +3, время: 09:38. |