1. 什么是事件?
事件+监听对象
Ext.create('Ext.Panel', { html: 'My Panel', renderTo: Ext.getBody(), listeners: { afterrender: function() { Ext.Msg.alert('We have been rendered'); } } });
Ext.panel.Panel当前有45个事件类型
2. 监听事件的发生
点击按钮触发事件:MessageBox
Ext.create('Ext.Button', { text: 'Click Me', renderTo: Ext.getBody(), listeners: { click: function() { Ext.Msg.alert('I was clicked!'); } } });
点击按钮触发事件:this.hide()
//点击按钮则隐藏 //在button里面定义监听者 Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'My Button', listeners: { mouseover: function() { this.hide(); }, hide: function() { // Waits 1 second (1000ms), then shows the button again Ext.defer(function() { this.show(); }, 1000, this); } } });
3. 稍后定义监听者:在组件创建完成后
//先定义了button var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'My Button' }); //在定义监听事件 button.on('click', function() { Ext.Msg.alert('Event listener attached by .on'); });
var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'My Button' }); button.on({ mouseover: function() { this.hide(); }, hide: function() { Ext.defer(function() { this.show(); }, 1000, this); } });
4. 移除监听
//下面定义了3秒后移除监听 var doSomething = function() { Ext.Msg.alert('listener called'); }; var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'My Button', listeners: { click: doSomething, } }); Ext.defer(function() { button.un('click', doSomething); }, 3000);
5. 范围监听选项
var panel = Ext.create('Ext.Panel', { html: 'Panel HTML' }); var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'Click Me' }); button.on({ click: { scope: panel, //定义范围,也可以改成 scope:button, fn: function() { Ext.Msg.alert(this.getXType()); } } });
6. 只监听事件一次:不使其重复触发事件
var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'Click Me', listeners: { click: { single: true, //single属性 fn: function() { Ext.Msg.alert('I will say this only once'); } } } });
7. 使用缓冲配置:
//不管你点击多少次,只要在2秒内,他只触发一次事件 var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: 'Click Me', listeners: { click: { buffer: 2000, fn: function() { Ext.Msg.alert('I say this only once every 2 seconds'); } } } });
8. 触发自定义事件
var button = Ext.create('Ext.Button', { renderTo: Ext.getBody(), text: "Just wait 2 seconds", listeners: { //监听者触发了一个myEvent事件,包含button自身,以及一个调用1-100之间的随机数 myEvent: function(button, points) { Ext.Msg.alert('myEvent fired! You score ' + points + ' points'); } } }); Ext.defer(function() { var number = Math.ceil(Math.random() * 100); //通过事件名button调用fireEvent button.fireEvent('myEvent', button, number); }, 2000);
9. 监听DOM事件:不是所有Extjs组件可以引发事件,设置容器的参数
var container = Ext.create('Ext.Container', { renderTo: Ext.getBody(), html: 'Click Me!', listeners: { click: function(){ Ext.Msg.alert('I have been clicked!') } } }); container.getEl().on('click', function(){ this.fireEvent('click', container); }, container);
10. 事件的规范化:Extjs5版本以上,关键应用在touch-screen设备
从鼠标点击等效到触摸或手指点击
// a mouse event, myElement.on('mousedown', someFunction);
事件系统转译成设备支持的touchstart
myElement.on('touchstart', someFunction);
或者转译成支持的pointerdown
myElement.on('pointerdown', someFunction);
注:并非所有的操作都是那么好转译的
11. 动作:Gestures
除了标准的DOM事件外,Elements也可以应用到“gesture”事件,主要用在Sencha Touch
有3中最初的类型:(pointer, touch, 和 mouse 事件)start, move, 和 end
Event | Touch | Pointer | Mouse |
---|---|---|---|
Start | touchstart | pointerdown | mousedown |
Move | touchmove | pointermove | mousemove |
Stop | touchend | pointerup |
//Ext JS 5允许任何手势回应任何类型的输入 Ext.get('myElement').on('longpress', handlerFunction);