让我们从描述 DOM 元素的事件处理开始。
DOM 节点事件处理
首先,您不想直接使用 DOM 节点。相反,您可能希望使用Ext.Element
界面。为了分配事件处理程序,Element.addListener
和Element.on
(这些是等效的)被创建。因此,例如,如果我们有 html:
<div id="test_node"></div>
我们想要添加click
事件处理程序。
让我们检索Element
:
var el = Ext.get('test_node');
现在让我们检查click
事件的文档。它的处理程序可能有三个参数:
click( Ext.EventObject e, HTMLElement t, Object eOpts )
知道所有这些东西,我们可以分配处理程序:
// event name event handler
el.on( 'click' , function(e, t, eOpts){
// handling event here
});
小部件事件处理
小部件事件处理与 DOM 节点事件处理非常相似。
首先,widgets的事件处理是利用Ext.util.Observable
mixin来实现的。为了正确处理事件,您的小部件必须包含Ext.util.Observable
作为 mixin。Ext.util.Observable
默认情况下,所有内置小部件(如 Panel、Form、Tree、Grid 等)都作为 mixin。
对于小部件,有两种分配处理程序的方法。第一个 - 是使用on方法(或addListener
)。例如,让我们创建Button
小部件并为其分配click
事件。首先,您应该检查事件的文档以获取处理程序的参数:
click( Ext.button.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
配置分配给这个小部件:
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();
});