`
gkuiyj
  • 浏览: 92793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext架构分析(1)--理解Ext.util.Event

阅读更多
Ext架构分析(1)--理解Ext.util.Event
原文链接  http://webtec.blog.ccidnet.com/blog-htm-do-showone-uid-77419-type-blog-itemid-246149.html

  由于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);
    };
  };


分享到:
评论

相关推荐

    extjs帮助文档pdf版

    #### 1. Ext 类 (P.2) - **概述**:`Ext` 是 ExtJS 的核心命名空间,包含了全局的方法和属性。 - **用途**:提供了一个统一的入口来访问 ExtJS 库的功能,如创建组件、管理事件等。 - **常用方法**: - `Ext.create...

    Ext API详解--笔记

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

    extjs帮助文档

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

    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_类的详细介绍

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

    EXT核心API详解.doc

    1. **Ext类**:EXT库的基础类,提供了许多实用的方法,如创建元素、事件处理等。 2. **Array类**:扩展了JavaScript原生的数组对象,提供了如each、indexOf、remove等功能,增强了数组操作能力。 3. **Number类**...

    Ext+JS深入浅出.pdf

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

    学习YUI.Ext 第四天--对话框Dialog的使用

    YAHOO.util.Event.onDOMReady(HelloWorld.init); // 当文档加载完成时初始化 ``` - **实例化对话框**:通过`new YAHOO.ext.BasicDialog()`创建实例,并传入容器ID以及配置项。 - **添加键盘监听器**:使用`...

    ext事件模型

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

    ext-3.0框架源码

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

    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

    java数独程序java数独程序.doc

    根据提供的文件信息,我们可以分析出该Java程序是一个用于实现数独游戏的应用程序。接下来,我们将对这段代码的关键知识点进行详细解读。 ### 关键知识点 #### 1. 导入必要的库 ```java import java.awt.*; import...

    java SE API

    JavaTM 2 Platform Standard Ed. 5.0 所有类 软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event ...org.xml.sax.ext org.xml.sax.helpers

    jdk 中文版

    java jdk api帮助文档中文版 JavaTM Platform Standard Ed. 6 所有类 软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd ...org.xml.sax.ext org.xml.sax.helpers

    JAVA_API1.6文档(中文)

    java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)...

Global site tag (gtag.js) - Google Analytics