让我们从描述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节点事件处理非常相似。
首先,利用Ext.util.Observable
mixin 实现小部件事件处理。为了正确处理事件,您的小部件必须包含Ext.util.Observable
一个mixin。Ext.util.Observable
默认情况下,所有内置小部件(如Panel,Form,Tree,Grid,...)都具有mixin。
对于小部件,有两种分配处理程序的方式。第一个-是在方法(或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
config 将Click事件分配给此窗口小部件:
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()
。
例如,让我们将click事件处理程序分配给我们的按钮。如果未单击左键,则阻止默认浏览器操作:
myButton.on('click', function(btn, e){
if (e.button !== 0)
e.preventDefault();
});