Javascript.RU

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

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

Соответственно хотелось бы узнать ваше мнение и комментарии.
А может это возможно сделать гораздо проще?
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2010, 11:25
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от Мараторий
Что если мне очень не хочется навешивать на функции guid?
ну для начала, наверное, надо разобраться, почему очень не хочеться

а отрефакторить тот код с видимым результатом, думаю, можно

а еще можно подумать, нужно ли удаление обработчиков событий
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2010, 11:43
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от x-yuri
а еще можно подумать, нужно ли удаление обработчиков событий
Нужно.

В первую очередь нужно разобраться, а надо ли выдумывать свой addEventListener поверх нативного.
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2010, 11:59
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Сообщение от Kolyaj Посмотреть сообщение
В первую очередь нужно разобраться, а надо ли выдумывать свой addEventListener поверх нативного.
Конечно не всегда нужен такой навороченный, как описано в статье. Но, если нужен кроссбраузерный метод, то да. Хотя бы для того, чтобы в IE функция обработчик тоже выполнялась в контексте объекта, на который навешан обработчик.

Последний раз редактировалось Мараторий, 30.01.2010 в 12:02.
Ответить с цитированием
  #5 (permalink)  
Старый 31.01.2010, 01:28
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

А еще про 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();

Последний раз редактировалось PeaceCoder, 31.01.2010 в 01:38.
Ответить с цитированием
  #6 (permalink)  
Старый 31.01.2010, 02:59
Аватар для Мараторий
Кандидат Javascript-наук
Отправить личное сообщение для Мараторий Посмотреть профиль Найти все сообщения от Мараторий
 
Регистрация: 22.01.2010
Сообщений: 114

Если честно, не очень понял вашу мысль.
Какую роль здесь играют функции test1 и test2?
abc() - это обработчик события, как я понимаю.
Ответить с цитированием
  #7 (permalink)  
Старый 31.01.2010, 11:13
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

PeaceCoder, проблемы будут, если попытаться навесить одну функцию дважда тому же самому элементу, на то же самое событие
Ответить с цитированием
  #8 (permalink)  
Старый 31.01.2010, 17:46
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от Мараторий
Если честно, не очень понял вашу мысль.
Какую роль здесь играют функции test1 и test2?
abc() - это обработчик события, как я понимаю.
test1 и test2 для показа что guid не будет undefined в var как некоторым может показаться.
abc это да обработчик.
Сообщение от x-yuri
PeaceCoder, проблемы будут, если попытаться навесить одну функцию дважда тому же самому элементу, на то же самое событие
для этого создается функция isBind(obj,fn) которая просто пройдясь по objs в fn или fns в obj найдет или нет идентичный id

Последний раз редактировалось PeaceCoder, 31.01.2010 в 17:49.
Ответить с цитированием
  #9 (permalink)  
Старый 03.02.2010, 21:08
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Сообщение от x-yuri
PeaceCoder, проблемы будут, если попытаться навесить одну функцию дважда тому же самому элементу, на то же самое событие
иначе проблем не будет. А так как непонятно, зачем это делать, то твой совет лишний
Ответить с цитированием
  #10 (permalink)  
Старый 04.02.2010, 13:35
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

Сообщение от x-yuri
иначе проблем не будет.
если ты не понял что я написал, то нечего осуждать того чего нет.
Попробуй через guid повесить несколько обьектов на ГОТОВУЮ функцию, а потом unbind этой функции с любого обьекта. Если непонял о чем я, то при unbind этой функции она перестанет работать на всех обьектах.
__________________
Настоящий программист думает и осознает сам решение задачи, а не копирует другие мысли, не осознавая их (c)
Относись к человеку так же, как хотелось бы отношения к себе (с)
Все нужно там, где оно нужно, а все не нужно нигде (с) Gozar
B~Vladi: А кто такой JavaScript стрелок?! micscr: это тот, кто не jQuery танкист.
Программы становятся медленнее быстрее, чем компьютеры становятся быстрее (с) Никлаус Вирт
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
События Jquery и не только Tohin Events/DOM/Window 3 21.08.2009 14:57
Drug&Drop + всплывание события = проблемы =(( _NoName_ Events/DOM/Window 4 05.03.2009 17:47
Явный вызов процедуры обработки события. supchik Общие вопросы Javascript 18 27.01.2009 13:16
Вопрос про вызов события onClick skyfish Общие вопросы Javascript 12 27.12.2008 19:12
ижний DIV реагирует на события поступающие от, DIV'а лежащего выше bug в IE6,7 Royan Общие вопросы Javascript 6 22.12.2008 12:40