Начнем с описания обработки событий элементов DOM.
Обработка событий узла DOM
Прежде всего, вы не захотите напрямую работать с узлом DOM. Вместо этого вы, вероятно, захотите использовать Ext.Element
интерфейс. С целью назначения обработчиков событий Element.addListener
и Element.on
(они эквивалентны) были созданы. Так, например, если у нас есть html:
<div id="test_node"></div>
и мы хотим добавить click
обработчик событий.
Получим Element
:
var el = Ext.get('test_node');
Теперь давайте проверим документы на предмет click
события. Его обработчик может иметь три параметра:
щелкните (Ext.EventObject e, HTMLElement t, Object eOpts)
Зная все это, мы можем назначить обработчик:
// event name event handler
el.on( 'click' , function(e, t, eOpts){
// handling event here
});
Обработка событий виджетов
Обработка событий виджетов очень похожа на обработку событий узлов DOM.
Прежде всего, обработка событий виджетов осуществляется с помощью Ext.util.Observable
миксина. Чтобы правильно обрабатывать события, ваш виджет должен иметь Ext.util.Observable
вид миксина. Все встроенные виджеты (например, панель, форма, дерево, сетка, ...) имеютExt.util.Observable
по умолчанию используются в качестве миксина.
Для виджетов есть два способа назначения обработчиков. Первый - использовать по методу (или addListener
). Например, создадим Button
виджет и назначим ему click
событие. Прежде всего, вы должны проверить документацию события на предмет аргументов обработчика:
нажмите (Ext.button. нажмите this, Event e, Object eOpts)
Теперь воспользуемся on
:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button'
});
myButton.on('click', function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
});
Второй способ - использовать конфигурацию слушателей виджета :
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
listeners : {
click: function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
}
});
Обратите внимание, что Button
виджет - это особый вид виджетов. Событие клика можно назначить этому виджету с помощью handler
config:
var myButton = Ext.create('Ext.button.Button', {
text: 'Test button',
handler : function(btn, e, eOpts) {
// event handling here
console.log(btn, e, eOpts);
}
});
Запуск пользовательских событий
Прежде всего, вам нужно зарегистрировать событие с помощью метода addEvents :
myButton.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
Используя addEvents
метода необязательно. В комментариях к этому методу говорится, что использовать этот метод нет необходимости, но он предоставляет место для документации событий.
Чтобы запустить событие, используйте метод fireEvent :
myButton.fireEvent('myspecialevent1', arg1, arg2, arg3, /* ... */);
arg1, arg2, arg3, /* ... */
будет передан обработчику. Теперь мы можем обработать ваше событие:
myButton.on('myspecialevent1', function(arg1, arg2, arg3, /* ... */) {
// event handling here
console.log(arg1, arg2, arg3, /* ... */);
});
Стоит отметить, что лучшее место для вставки вызова метода addEvents - это initComponent
метод виджета, когда вы определяете новый виджет:
Ext.define('MyCustomButton', {
extend: 'Ext.button.Button',
// ... other configs,
initComponent: function(){
this.addEvents('myspecialevent1', 'myspecialevent2', 'myspecialevent3', /* ... */);
// ...
this.callParent(arguments);
}
});
var myButton = Ext.create('MyCustomButton', { /* configs */ });
Предотвращение всплытия событий
Для предотвращения образования пузырей можно return false
или использовать Ext.EventObject.preventDefault()
. Чтобы предотвратить действия браузера по умолчанию, используйтеExt.EventObject.stopPropagation()
.
Например, назначим нашей кнопке обработчик события нажатия. И если не была нажата левая кнопка, предотвратить действие браузера по умолчанию:
myButton.on('click', function(btn, e){
if (e.button !== 0)
e.preventDefault();
});