stopPropagation
в обычном js при любом событии передается объект event(при том же change)
var changeDiv = function(event) { event = event || window.event; event.preventDefault(); //... действия } Где его взять в Ext (4.0)? xtype: 'numberfield', fieldLabel: 'number', value: 0, labelWidth: 20, width: 80, listeners: { change: function(ths, newValue, oldValue, eOpts) { event = event || window.event; console.log(123); event.preventDefault(); } } |
незнаю верно ли понял вопрос.
Я знаю только два способа. способ 1. (при навешивании обработчика на событие) // предотвращаем всплывание exl.on('click', this.onClick, this, {stopPropagation: true}); // предотвращает событие навешанное по дефолту ex1.on('click', this.onClick, this, {preventDefault: true}); способ 2. (в обработчике) function handleClick(event, target){ // обработчик события // предотвращает событие навешанное по дефолту event.preventDefault(); // предотвращает всплывание event.stopPropagation(); // заменяет обе функции,предотвращает и всплывание и дефолт одновременно. event.stopEvent(); ... } способ 3) вот здесь я не уверен. Я этого ненашёл в документации, но по логике это должно быть. xtype: 'numberfield', fieldLabel: 'number', value: 0, labelWidth: 20, width: 80, listeners:{ change: { stopPropagation: true, fn(ths, newValue, oldValue, eOpts){ .... } } } |
хм. отсюда взяли http://erum.ru/67.htm ?? я там уже был.
я не понимаю откуда берется handleClick(event, target)? когда должны передаваться эти параметры click( Ext.button.Button this, Event e, Object eOpts ) [http://docs.sencha.com/ext-js/4-0/#!...button.Button] т.е. listeners: { click: function(ths, e, eOpts) { //... } } |
кстати при клике есть объект event, а при change - нет
|
угу, и не только оттуда.
вот ещё хороший источник http://podlipensky.com/post/2009/07/...js-events.aspx ну и документация конечно. я так понимаю что конечная цель предотвратить всплытие change. Ну как аварийный вариант попробуйте через on c опциями навешать. Ещё один способ борьбы с пузырями return false; - в обработчике. Сейчас тороплюсь, вернусь, покавыряю исходники с оф доками, тогда отпишусь точнее. |
КХМ, поковырял.
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 - Имя события Даже незнаю что ещё можно добавить )) |
Написали много, спасибо, но все равно с трудом все в голову входит))) лучшая теория - это практика.
допустим у меня есть объект, который можно двигать (draggable: true) и есть событие move: var fx = Ext.getCmp('numberfield_x'); move: function(ths, x, y) { fx.setValue(x); //запихиваем в numberfield_x значение икса } и есть поле числовое, куда значения записываются. у него есть событие change. и при перемещении объекта срабатывает change (где мне этого не нужно) xtype: 'numberfield', id: 'numberfield_x', fieldLabel: 'x', value: 0, labelWidth: 20, width: 80, listeners: { change: function(ths, newValue, oldValue, event) { console.log(1); } } можете туго доходящему показать куда что и как прописать, чтобы в консоль эта единичка не записывалась т.е. не вызывалось событие из за перемещения другого объекта??)) буду оч рад)) |
тут вариантов 10 наверно)
ну вот самый, самый тупой var flag=false; var fx = Ext.getCmp('numberfield_x'); move: function(ths, x, y) { flag=true; fx.setValue(x); flag=false; //запихиваем в numberfield_x значение икса } xtype: 'numberfield', id: 'numberfield_x', fieldLabel: 'x', value: 0, labelWidth: 20, width: 80, listeners: { change: function(ths, newValue, oldValue, event) { if (flag==false){ console.log(1); } } } Вместо глобального флага можно попробывать fx.flag this.flag |
ну а если не самый тупой? просто у меня не хватает мозгов, чтобы все это сообразить)) то что вы ДО этого писали
|
Прошу прощения ))
тупой это не потому что кто то не понимает что то сложнее. А тупой потому что, топорно простой. о других чуть попозже. |
Часовой пояс GMT +3, время: 14:47. |