理解Ext.util.Event
由于Ext2.0中所有的组件都是由Observable继承而来,理解Ext就需要先从Ext.util.Observable说起,而 Observable是对Event对象进行管理,从而理解Observable必须首先从Ext.util.Event说起。
Ext.util.Event是一个封装的非常精致的对象,但和你想象的不同,Event同任何的HTML DOM元素没有任何的关系(尽管Ext是处理HTML元素的),实际上,它是一个通用的事件及其事件的处理的对象。 也许有朋友要问,HTML Element本身已经支持了事件,为什么还要再重新设计一套Event机制呢?其实,基本上所有的javascript框架都会实现自己的Event机制,原因很多,但是至少有一点:HTML元素对于事件的处理是通过简单的单一绑定实现,也就是说,如果不进行任何的封装,你的事件只能唯一的绑定到一个事件处理句柄,举个例子:
var e=document.getElementById("test");
e.onclick=function(){alert("handle1")};
e.onclick=function(){alert("handle2")};
运行的结果你会发现,只会弹出一个"handle2"的alert框,因为第一个事件已经被第二个事件覆盖了。而使用Ext框架,你可以放心的解决这个问题,同一个事件可以依次被绑定到多个事件处理句柄上。
Ext.util.Event对象构建器需要传入两个对象:obj(处理事件的缺省对象),name(事件名称)。在构建Event对象时,Event对象会同时构建一个事件的处理函数的数组:listeners,通过这个数组实现了一个事件的多个事件句柄函数的处理。
Ext.util.Event = function(obj, name){
this.name = name;
this.obj = obj;
this.listeners = [];
};
通过Event的fire方法就可以依次触发该数组中的处理函数。实际上,fire方法在遍历listeners数组中的处理函数过程中,只要处理函数的返回值为false,则不再继续运行后续的处理函数。所以,可以通过检查fire方法的返回值得知事件处理函数是否完全被运行。
fire : function(){
var ls = this.listeners, scope, len = ls.length;
if(len > 0){
this.firing = true;//通过firing可以保证多个事件处理函数不会并发运行
var args = Array.prototype.slice.call(arguments,
0);//slice方法可以有效的进行数组的克隆
for(var i = 0; i < len; i++){
var l = ls;
//事件的处理,只要有一个处理函数返回false,整个事件处理就被停止
if(l.fireFn.apply(l.scope||this.obj||window,
arguments) === false){
this.firing = false;
return false;
}
}
this.firing = false;
}
return true;
}
Event可以通过addListener、removeListener、clearListeners(移除所有的事件处理函数)方法对 listeners进行管理。但是,Listener中保存的事件处理函数实际上并不是addListener传递的函数,实际上, addListener传入的方法通过createListener对事件的处理函数进行了封装,通过封装,实现了对通一个重复事件的的三种不同处理方式:delay(延迟运行)、single(移除Listener中的处理函数,仅运行当前的处理函数)、buffer(避免重复运行处理函数)。
createListener : function(fn, scope, o){
o = o || {};
scope = scope || this.obj;
var l = {fn: fn, scope: scope, options: o};
var h = fn;
if(o.delay){
h = createDelayed(h, o, scope);
}
if(o.single){
h = createSingle(h, this, fn, scope);
}
if(o.buffer){
h = createBuffered(h, o, scope);
}
l.fireFn = h;
return l;
}
var createBuffered =
function(h, o, scope){
var task = new Ext.util.DelayedTask();
return function(){
task.delay(o.buffer, h, scope,
Array.prototype.slice.call(arguments, 0));
};
};
var createSingle = function(h,
e, fn, scope){
return function(){
e.removeListener(fn, scope);
return h.apply(scope, arguments);
};
};
var createDelayed = function(h,
o, scope){
return function(){
var args = Array.prototype.slice.call(arguments,
0);
setTimeout(function(){
h.apply(scope, args);
}, o.delay || 10);
};
};
分享到:
相关推荐
- `Ext.util.DelayedTask.delay(delay, fn, scope, args)`: 创建一个延迟任务。 - `Ext.util.DelayedTask.cancel(task)`: 取消延迟任务。 #### 21. Ext.util.TaskRunner 类 (P.21) - **概述**:用于管理和运行...
- `Ext.EventManager.on(element, eventName, handler[, scope])`:添加事件监听器。 - `Ext.EventManager.un(element, eventName, handler)`:移除事件监听器。 #### 十二、Ext.EventObject类(第15页) - **...
- **Ext.util.Observable**:用于观察对象的变化,是Ext JS中实现事件驱动的核心。 - **Ext.EventManager**:用于管理事件监听器。 - **Ext.EventObject**:封装了事件对象,提供了一系列方法来处理事件。 - **...
`EXT核心API详解(一) - Ext类.txt`介绍了Ext的基础类,包括`Ext.util.Observable`(观察者模式的实现)、`Ext.app.Application`(管理应用生命周期)等。理解这些类的用法对于构建可维护的应用至关重要。 4. **Ext...
5.3.1 内部事件对象:ext.util.event / 184 5.3.2 为组件添加事件接口:ext.util.observable / 188 5.3.3 为组件绑定事件 / 189 5.3.4 内部事件的触发过程 / 192 5.3.5 移除事件 / 194 5.4 特定功能的事件对象...
Ext对象还提供了一些全局函数,如Ext.util.Format用于字符串格式化,Ext.apply用于对象属性的复制,以及Ext.emptyFn作为空函数的引用等。理解Ext类的基本用法对于后续使用其他EXT组件至关重要。 "EXT核心API详解(二...
- **Ext.util.Observable**:这是一个核心类,实现了观察者模式,使得组件能够响应外部事件。 - **Ext.EventManager**:用于管理全局事件监听器,简化了事件的注册和解绑过程。 - **Ext.EventObject**:表示事件对象...
7. **主题和皮肤**:`Ext.theme`和`Ext.util.CSS`负责主题的加载和应用,通过修改CSS样式实现UI定制。 通过阅读EXT 3.0的源码,开发者不仅可以深入了解其内部工作原理,还能学习到优秀的JavaScript编程实践,提升...
2.1.4 Ext.util.Observable 14 2.1.5 Ext.EventManager 17 2.1.6 Ext.EventObject 19 2.2 EXT的核心组件 20 2.2.1 Ext.Component 20 2.2.2 Ext.BoxComponent 22 2.2.3 Ext.Container 23 2.2.4 Ext.Panel 24 ...
11. **Ext.EventManager类**:事件管理类,负责事件的监听和分发。 12. **Ext.EventObject类**:事件对象,封装了浏览器的原始事件,提供了统一的事件处理接口。 13. **Ext.CompositeElement类**和**...
通过本文对`ext事件模型`的介绍,我们了解了`Ext.lib.Event`和`Ext.util.Observable`这两个核心组件的功能与用法。掌握了这些知识,开发者就能够更加高效地处理页面中的各种事件,构建出更加强大和复杂的前端应用...
通过上述介绍,我们可以看出 **Ext.lib.Event** 和 **Ext.util.Observable** 在 ExtJS 库中分别承担着不同的职责,但都是处理事件的关键部分。理解这两个类的工作原理和使用方法对于高效地使用 ExtJS 开发复杂用户...
为了更直观地理解BeanShell的应用,我们可以通过Eclipse IDE来创建一个简单的项目示例。 1. **创建项目**: - 在Eclipse中新建一个Java项目,命名为`TestBeanShell`。 2. **编写Java类**: - **Person.java**:...
[07]EXTJS4.0的事件机制Event.001.zip (70.00M)[07]EXTJS4.0的事件机制Event.003.zip [07]EXTJS4.0的事件机制Event.002.zip 第八讲:extjs4.0的Ajax [08]EXTJS4.0的Ajax.003.zip (53.77M)[08]EXTJS4.0的Ajax....
javase 中文API 最新版 ******************************* JavaTM 2 Platform Standard Ed.... 所有类软件包 java.applet java.awt ...java.awt.event ...java.util ...org.xml.sax.ext org.xml.sax.helpers
implementation(name: 'libvlc-x86-3.1.0', ext: 'aar') ``` 3. 同步项目,确保Gradle能够正确解析并引入库。 **创建VLCPlayer视图** 在XML布局文件中,我们需要创建一个自定义的`SurfaceView`,用于显示VLC...