欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Ext中使用事件 博客分类: Extjs EXTJavaScript浏览器编程工作 

程序员文章站 2024-02-03 13:13:40
...
事件的定义

事件一个消息、一次函数的调用,可由程序(或其中的部分)生成;事件源,用于通知其他的程序(的其中一部分);事件处理器,就是触发某些内容。事件会由用户的动作或事件源的状态发生改变而生成。事件源独立于事件侦听器,哪怕是没有人去侦听它或定义好一个侦听器都是生成事件。我们说无限循环(infinite loop)的思想在于:“有用户把鼠标移动到[x,y]坐标了,我正在通知全体的成员,有没有人侦听、谁是侦听者不是我关心的事情” 。侦听者(listener)的思想在于:“用户一移动鼠标,就要告诉我,让我执行某些事情”。
Ext中的事件

Ext中的事件可以分为“两类”: DOM事件与 JavaScript(或程序)事件。
DOM事件

显示网页的浏览器已经有某种“无限循环”的机制以处理用户的动作,并根据DOM元素所发生的动作去触发事件。

以往我们一般是这样设置DOM元素事件侦听器的:

<div id="mydiv" onclick="alert('你点击了我。')">请点击!</div>

Ext.Element 对DOM元素的事件进行打包,现在设置事件侦听器的方式变为这样:

Ext.get('mydiv').on('click', function() {alert('你点击了我。');});

It can be said that DOM events are "passed-through" from DOM through Ext.Element to listeners.
JavaScript事件

现在,事件源不但会是DOM元素,而且可以是任意的JavaScrpt对象,轻松实现事件源的逻辑和加入侦听器。可是,这带来什么好的方面呢?

试想一下一个复杂的组件如GRID。只对DOM事件编程话,像列移动这样的用户动作处理起来变得极端复杂。你必须要侦听DOM的元素,处理鼠标的点击、移动、计算出列移动的距离等等。如采用GRID组件的话,相信可摆脱烦复的工作,变为一件轻松的事情:所有东西完成好后,通知你“用户已经移动列三到位置一”。这就是GRID的功劳:它触发JS事件,通知预设好的侦听者发生了什么事儿。其他的ext组件也是这么一回事。如验证事件、树折叠...
如何监听事件

对于Ext类中的某个对象,假设一面板(Panel),当面板大小变化时,就会执行相应的动作,这样你需要加入一个侦听器来实现你的动作:

//创建面板
var myPanel = new Ext.Panel({...});

// 加入大小变化的侦听器
myPanel.on('resize', function(panel, w, h) {
    alert('Panel resized to ' + w + 'x' + h);
});

这样的效果是,无论任何时候面板myPanel一发生变化,便会调用函数执行你预设的动作。
如何创建事件源?

事件相关的函数是由Ext.util.Observable 类来实现,所以如果现在是一个事件源的扩展程序,只要继承Observable便可。而且,如果你已经是从Observable的子类上获取继承(Panel、Grid、Form、Tree等)那么已经是一个事件源了。事件的触发是由父类所执行的。

随便监听和触发事件~尽情地使用事件吧!

转http://www.extjs.com/learn/Tutorial:Events_Explained_%28Chinese%29