Показать сообщение отдельно
  #1 (permalink)  
Старый 30.01.2010, 05:16
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Про добавление события и не только
Я по поводу статьи 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. Для этого надо немного доработать кэш, добавить возможность сопоставлять (прикреплять) произвольный объект к объекту в кэше.

Т.е. моей целью является осуществление добавления обработчиков событий без какого либо изменения функций и объектов.

Соответственно хотелось бы узнать ваше мнение и комментарии.
А может это возможно сделать гораздо проще?
Ответить с цитированием