Тема: stopPropagation
Показать сообщение отдельно
  #6 (permalink)  
Старый 12.05.2012, 17:55
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

КХМ, поковырял.

Ext.EventObject - это обёртка над родным обьектом события в браузере, служит для повышения кросс браузерности. Тоесть где нет события браузера, там нет EventObject. Так как change инициируется не событием браузера то и EventObject к этому событию ни какого отношения не имеет.

что касается события Change вообще.
Генерация события происходит в методе checkChange класса numberfield
запуск этой функции инициализируется методами вроде setValue

checkChange: function() {
        if (!this.suspendCheckChange) {
            var me = this,
                newVal = me.getValue(),
                oldVal = me.lastValue;
            if (!me.isEqual(newVal, oldVal) && !me.isDestroyed) {
                me.lastValue = newVal;
                // вот здесь генерируется событие
                me.fireEvent('change', me, newVal, oldVal);
                me.onChange(newVal, oldVal);
            }
        }
    },


тобиш мы можем создать свой собственный класс customNumberfield унаследовав его от numberfield.
Далее можем переопределить checkChange и генерировать события в том виде в каком они нам удобны.
Вплоть до замены события вызвом функции, или генерации события только в определённых случаях.

.....
Теперь, что касается механизьма событий.

FireEvent() берёт информацию о событии из обьекта events
Кстатии сам он нечего не вызывает, а просто передаёт работу continueFireEvent который и обеспечивает всплытие в цикле do While. Цикл прерывается через break, если обработчик события возвращает false.

в events можно найти много чего вкусного.
к примеру
events[имя события].bubble - флаг отвечающий за всплытие.
events[имя события].listeners - массив с обработчиками этого события.

Если в двух словах пробежатся по всему алгоритму то.
1) continueFireEvent находит родителей по цепочке и вызывает для них метод Fire.
2) метод fire перебирае в цикле events[имя события].listeners и вызывает fireFn (функцию обработчик события)


До кучи отпишусь откуда берутся обработчики, вдруг кому интересно.

когда вы устанавливаете обработчик в listeners. ТО обьект listeners передаётся в конструкторе методу on. me.on(me.listeners);
То есть, установка обработчика через on и listeners, суть одно и тоже. (выходит я угадал во втором посте)

метод on в свою очередь это псевдоним метода addListener.

основная задача addListeners сводится к заполнению обьекта events.
addListeners в цикле перебирает те события которые вы ему передали (если их несколько)
добавление события происходит так.
me.events[ename] = event = new Ext.util.Event(me, ename); //ename - Имя события

Даже незнаю что ещё можно добавить ))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 12.05.2012 в 23:53.
Ответить с цитированием