`
y1d2y3xyz
  • 浏览: 257587 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Extjs源码之--Ext事件机制/继承关系

阅读更多

Extjs源码之--Ext.lib.Event 中分析了EXT事件简单封装,其实EXT事件主要有三个对象组成,而这些对象是相互继承或者是说结构上的从下到上的依赖关系,Ext.lib.Event是基础,封装了基本的事件模型,他是这个事件体系中的核心和基础,是属于adapter级别的,他屏蔽了浏览器的特征,这个对象其实是不对外的,从Ext源码中你也能发现这么一段(This function should ALWAYS be called from Ext.EventManager),这是对事件的监听的,其他的就封装在Ext.EventObject中。接下来是 Ext.EventObject 对象


看下面这段代码,这是Ext.EventObject构造函数

var E = Ext.lib.Event;
Ext.EventObjectImpl = function(e){
        if(e){
            this.setEvent(e.browserEvent || e);//注意这里
        }
    }

在看 setEvent 函数都做了些什么
Ext.EventObjectImpl.prototype = {
           /** @private */
        setEvent : function(e){
            var me = this;
            if(e == me || (e && e.browserEvent)){ // already wrapped
                return e;
            }
            me.browserEvent = e;
            if(e){
                // normalize buttons
                me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
                if(e.type == 'click' && me.button == -1){
                    me.button = 0;
                }
                me.type = e.type;
                me.shiftKey = e.shiftKey;
                // mac metaKey behaves like ctrlKey
                me.ctrlKey = e.ctrlKey || e.metaKey || false;
                me.altKey = e.altKey;
                // in getKey these will be normalized for the mac
                me.keyCode = e.keyCode;
                me.charCode = e.charCode;
                // cache the target for the delayed and or buffered events
                me.target = E.getTarget(e);
                // same for XY
                me.xy = E.getXY(e);
            }else{
                me.button = -1;
                me.shiftKey = false;
                me.ctrlKey = false;
                me.altKey = false;
                me.keyCode = 0;
                me.charCode = 0;
                me.target = null;
                me.xy = [0, 0];
            }
            return me;
        }
}

从上面代码很清楚的看到,Ext.EventObject构造函数除了对存在的兼容性问题进行屏蔽,还把 Ext.lib.Event属性传给了新的对象,如:me.target = E.getTarget(e);,me.xy = E.getXY(e);。接下来就是一些对外的接口方法,所以这个对象是提供对外接口的

Ext.EventObject = function(){
    var E = Ext.lib.Event,
        // safari keypress events for special keys return bad keycodes
        safariKeys = {
           
        },
        // normalize button clicks
        btnMap = Ext.isIE ? {1:0,4:1,2:2} :
                (Ext.isWebKit ? {1:0,2:1,3:2} : {0:0,1:1,2:2});

    Ext.EventObjectImpl = function(e){
        if(e){
            this.setEvent(e.browserEvent || e);
        }
    };
     Ext.EventObjectImpl.prototype = {
           /** @private */
        setEvent : function(e){
        
        },
        。。。。。。。。
     }
     return new Ext.EventObjectImpl();
}

再来看看Ext.EventManager 对象的结构:
Ext.EventManager = function(){
  var .......//一堆变量/常量的定义
   E = Ext.lib.Event,//这俩个变量要注意
   D = Ext.lib.Dom,//
   ..............////一堆变量/常量的定义
  
   //接下来一堆的 function 
   ......................

   //接下来是返回对象,也就是这个对象为外部提供接口
   var pub = {
           addListener : function(element, eventName, fn, scope, options){},
           removeListener : function(el, eventName, fn, scope){},
           removeAll : function(el){},
           getListeners : function(el, eventName) {},
           purgeElement : function(el, recurse, eventName) {},
           _unload : function() {},
           onDocumentReady : function(fn, scope, options){}
    };
    
    pub.stoppedMouseDownEvent = new Ext.util.Event();
    return pub;
}


从上面提供的接口看,Ext.EventManager实际上还是对 Ext.lib.Event的扩展和封装,以提供统一的对外接口,而且这里还提供了onDocumentReady这个接口,这个接口涉及到浏览器兼容性问题!而且这个接口的很多函数都用到了Ext.EventObject对象中的方法,所以从代码上看Ext.EventManager是依赖于Ext.EventObject的扩展的!理解了这三个对象的关系对于EXT的事件的理解就简单多了,而且要是看了源码的话,在自己应用中就知道应该注意哪些问题,特别是兼容性和性能上!

分享到:
评论

相关推荐

    使用OOP的方式扩展ExtJS UI组建 - 更新版

    例如,我们可以创建一个名为`MyCustomGrid`的类,继承自`Ext.grid.Panel`,并在子类中添加新的功能,如自定义渲染器、事件处理等。 在OOP的视角下,继承允许我们保持代码的复用性。通过覆盖父类的方法,我们可以...

    ExtJS 3.4 源码包

    - **调试工具**:利用浏览器的开发者工具,可以追踪ExtJS源码中的错误和性能瓶颈。 - **主题定制**:ExtJS允许自定义皮肤,通过修改CSS文件,可以调整应用的视觉样式。 6. **与其他技术集成** - **PHP, ASP.NET,...

    EXT-In-FirstStep

    - 探讨EXT框架内的继承机制,如何创建自定义组件并继承EXT的基类。 以上知识点覆盖了EXT框架的各个方面,从基本概念到高级应用,旨在为学习者提供全面而深入的理解。无论是初学者还是有经验的开发者,都能从中找到...

    ext入门学习文档

    6. **完善的事件处理机制**:提供了强大而灵活的事件系统,便于开发者处理各种用户交互事件。 #### 三、ExtJS 的特点 - **丰富的 UI 组件库**:包括按钮、面板、网格、表单控件等。 - **强大的数据绑定能力**:...

    ext面向对象和继承

    本篇文章将探讨EXTJS框架中的面向对象机制,特别是继承的概念,以及如何在实际开发中应用这些概念。 EXTJS是一个强大的JavaScript库,它提供了丰富的UI组件和数据绑定功能,适用于构建复杂的Web应用程序。在EXTJS中...

    Extjs中文教程

    - Extjs提供了丰富的动画效果,可以通过`Ext.Fx`和`Ext.Element`类实现。 - 动画效果包括淡入淡出、滑动、缩放等。 - **Ext.Fx类** - 提供了一组高级的动画效果,支持复杂的动画序列。 - 例如创建一个淡入效果...

    ExtJS中文手册.pdf

    - **源码细节**:发布ExtJS源码时会涉及到一些具体的细节问题,如文件结构、依赖关系等。 - **从何入手**:对于初学者来说,可以从简单的示例开始,逐步深入到更复杂的组件和功能。 #### 9. 适配器Adapters与核心...

    extjs2 的源码以及API

    2. `Ext 2 API Documentation.zip`:这很可能是EXTJS2的API文档,解压后可以得到详细的类、方法和事件说明,帮助开发者理解和使用EXTJS2框架。 3. `ext-2.2.1.zip`:这是EXTJS2的2.2.1版本源码,包含了框架的所有...

    ExtJS 3.2的中文参考手册

    - **继承机制**: 支持传统的面向对象编程中的继承特性,通过继承可以复用代码。 - **覆盖方法**: 子类可以覆盖父类的方法,实现更具体的功能。 #### 19. **EXT2概述** - **组件模型 (Component Model)**: 描述了...

    Ext2.2 中文手册

    - **源码结构**:Ext 框架的源码分为多个模块,每个模块负责特定的功能,例如 Core 模块包含了基础的 JavaScript 功能。 - **作用域管理**:JavaScript 中的作用域决定了变量的可见性。在 Ext 中,正确管理作用域...

    Ext继承分析

    在ExtJS中,`Ext.extend()` 是一个核心的函数,用于实现类之间的继承机制。它允许你创建新的类(子类),这些类将继承另一个类(父类)的属性和方法。这个功能对于构建复杂的JavaScript应用程序至关重要,因为它提供...

    无废话ExtJs 系列教程十八[继承:Extend]

    在"无废话ExtJS系列教程十八[继承:Extend]"中,我们主要关注的是ExtJS中的类继承机制,这是一个核心特性,它允许开发者创建可复用和可扩展的组件结构。在JavaScript中,继承是通过原型链实现的,而在ExtJS中,它被...

    EXTJS.docx

    - **ext-base.js**:包含EXT的核心代码,是框架的基础,负责处理DOM操作、事件管理等底层任务。 - **ext-core.js**:封装了EXT的核心组件,如面板、按钮、网格等,是构建用户界面的关键。 - **ext-core-debug.js**:...

    EXTJS经典教程

    - **继承机制**:Ext支持面向对象编程,通过继承可以扩展现有组件的功能。 - **模板(Templates)起步**: - **HTML模板**:通过创建HTML模板来定义UI组件的外观。 - **数据绑定**:讲解如何将数据绑定到模板上,...

    ext-3.0框架源码

    1. **ExtJS核心**:这是EXT框架的基础,包括基础类、事件系统、DOM操作、动画效果等。其中,`Ext.core`包含了EXT的核心类,如Element、Event对象等。 2. **组件体系**:EXT 3.0的组件都是基于`Ext.Component`抽象类...

    Extjs3.4.0版本 多选下拉框效果支持多选/全选/全不选

    1. **创建一个新的类**:定义一个继承自Ext.form.ComboBox的新类,添加必要的配置和方法来支持多选。 2. **配置store**:设置一个数据存储(Store)来保存可选项,确保每个记录都有一个表示选中状态的字段,如`...

    ExtJS的extend(Ext Designer的使用)

    ExtJS的`extend`特性是其核心的面向对象机制之一,它允许我们在JavaScript中创建类的继承链。在Ext Designer的环境下,这个概念尤为重要,因为设计师工具提供了可视化的界面来帮助开发者更直观地构建和扩展组件。这...

Global site tag (gtag.js) - Google Analytics