`
caibinghong
  • 浏览: 150003 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

小谈Ext架构-理解Ext.util.Event

 
阅读更多

理解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 = [];
};

通过Eventfire方法就可以依次触发该数组中的处理函数。实际上,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
可以通过addListenerremoveListenerclearListeners(移除所有的事件处理函数)方法对 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);
    };
  };

 

分享到:
评论

相关推荐

    extjs帮助文档pdf版

    - `Ext.util.DelayedTask.delay(delay, fn, scope, args)`: 创建一个延迟任务。 - `Ext.util.DelayedTask.cancel(task)`: 取消延迟任务。 #### 21. Ext.util.TaskRunner 类 (P.21) - **概述**:用于管理和运行...

    extjs帮助文档

    - `Ext.EventManager.on(element, eventName, handler[, scope])`:添加事件监听器。 - `Ext.EventManager.un(element, eventName, handler)`:移除事件监听器。 #### 十二、Ext.EventObject类(第15页) - **...

    Ext+JS深入浅出.pdf

    - **Ext.util.Observable**:用于观察对象的变化,是Ext JS中实现事件驱动的核心。 - **Ext.EventManager**:用于管理事件监听器。 - **Ext.EventObject**:封装了事件对象,提供了一系列方法来处理事件。 - **...

    Ext API详解--笔记

    `EXT核心API详解(一) - Ext类.txt`介绍了Ext的基础类,包括`Ext.util.Observable`(观察者模式的实现)、`Ext.app.Application`(管理应用生命周期)等。理解这些类的用法对于构建可维护的应用至关重要。 4. **Ext...

    Ext Js权威指南(.zip.001

    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 特定功能的事件对象...

    extapi

    Ext对象还提供了一些全局函数,如Ext.util.Format用于字符串格式化,Ext.apply用于对象属性的复制,以及Ext.emptyFn作为空函数的引用等。理解Ext类的基本用法对于后续使用其他EXT组件至关重要。 "EXT核心API详解(二...

    ext+js深入浅出

    - **Ext.util.Observable**:这是一个核心类,实现了观察者模式,使得组件能够响应外部事件。 - **Ext.EventManager**:用于管理全局事件监听器,简化了事件的注册和解绑过程。 - **Ext.EventObject**:表示事件对象...

    ext-3.0框架源码

    7. **主题和皮肤**:`Ext.theme`和`Ext.util.CSS`负责主题的加载和应用,通过修改CSS样式实现UI定制。 通过阅读EXT 3.0的源码,开发者不仅可以深入了解其内部工作原理,还能学习到优秀的JavaScript编程实践,提升...

    深入浅出ExtJS第2版

    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 ...

    EXT核心API详解.doc

    11. **Ext.EventManager类**:事件管理类,负责事件的监听和分发。 12. **Ext.EventObject类**:事件对象,封装了浏览器的原始事件,提供了统一的事件处理接口。 13. **Ext.CompositeElement类**和**...

    ext事件模型

    通过本文对`ext事件模型`的介绍,我们了解了`Ext.lib.Event`和`Ext.util.Observable`这两个核心组件的功能与用法。掌握了这些知识,开发者就能够更加高效地处理页面中的各种事件,构建出更加强大和复杂的前端应用...

    Ext_类的详细介绍

    通过上述介绍,我们可以看出 **Ext.lib.Event** 和 **Ext.util.Observable** 在 ExtJS 库中分别承担着不同的职责,但都是处理事件的关键部分。理解这两个类的工作原理和使用方法对于高效地使用 ExtJS 开发复杂用户...

    运用BeanShell脚本语言进行逻辑判断定义.pdf

    为了更直观地理解BeanShell的应用,我们可以通过Eclipse IDE来创建一个简单的项目示例。 1. **创建项目**: - 在Eclipse中新建一个Java项目,命名为`TestBeanShell`。 2. **编写Java类**: - **Person.java**:...

    EXTJS4.0视频教程配套代码

    [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-6.0_中文API_HTML(最新更新)

    javase 中文API 最新版 ******************************* JavaTM 2 Platform Standard Ed.... 所有类软件包 java.applet java.awt ...java.awt.event ...java.util ...org.xml.sax.ext org.xml.sax.helpers

    android实现vlc播放本地视频

    implementation(name: 'libvlc-x86-3.1.0', ext: 'aar') ``` 3. 同步项目,确保Gradle能够正确解析并引入库。 **创建VLCPlayer视图** 在XML布局文件中,我们需要创建一个自定义的`SurfaceView`,用于显示VLC...

Global site tag (gtag.js) - Google Analytics