`

ExtJs源码分析与学习—ExtJs元素Element(六)

阅读更多

批量操作元素Ext.CompositeElementLite

 

      该类提供了对一批元素进行相同操作的实现,他是建立在Ext.Element基础上,类中有一个集合,用来保存一批元素。该类的操作依赖于Ext.select,即Ext.Element.select函数来查询元素。
先看构造器方法

 

Ext.CompositeElementLite = function(els, root){
    this.elements = [];
    this.add(els, root);
    this.el = new Ext.Element.Flyweight();
};

      该构造器定义了两个变量,this.elements用来存放要添加的元素,this.el Ext.Element.Flyweight 对象,过程用来处理添加的元素,并利用this.add初始化元素,该方法代码如下:

 

    add : function(els, root){
        var me = this,
            elements = me.elements;
        if(!els){
            return this;
        }
        if(typeof els == "string"){
            els = Ext.Element.selectorFunction(els, root);
        }else if(els.isComposite){
            els = els.elements;
        }else if(!Ext.isIterable(els)){
            els = [els];
        }

        for(var i = 0, len = els.length; i < len; ++i){
            elements.push(me.transformElement(els[i]));
        }
        return me;
    },

 

      该函数根据所传不同参数,处理的会不一样,当els为 string时,会调用Ext.Element.selectorFunction返回数组,数组中元素为HTMLElement,Ext.Element.selectorFunction函数是Ext.DomQuery.select的别名,见Ext.DomQuery类的分析;当els.isComposite为true,即els本身就是Ext.CompositeElementLite的实例对象,那么直接取该对象的elements赋值给els;当els不可迭代,即不是数组,也不是对象。如传一个div元素,那么将其包装成数组。该方法中调用了transformElement

 

    transformElement : function(el){
        return Ext.getDom(el);
    },

      该方法把el转换为HTMLElement。下面看原型方法prototype

 

   getCount : function(){
        return this.elements.length;
    },

      该方法返回集合this.elements的长度。下面看invoke

 

    /**
     * 把Ext.Element.prototype中每一个函数包裹成新的函数,并调用执行
     * @param {} fn
     * @param {} args
     * @return {}
     */
    invoke : function(fn, args){
        var me = this,
            els = me.elements,//元素结合
            len = els.length,
            e,
            i;

        for(i = 0; i < len; i++) {
            e = els[i];
            if(e){//对每个元素都执行Ext.Element类的同名函数
                Ext.Element.prototype[fn].apply(me.getElement(e), args);
            }
        }
        return me;
    },

      该函数是为以下函数服务的

 

Ext.CompositeElementLite.importElementMethods = function() {
    var fnName,
        ElProto = Ext.Element.prototype,
        CelProto = Ext.CompositeElementLite.prototype;

    for (fnName in ElProto) {
        if (typeof ElProto[fnName] == 'function'){
            (function(fnName) {
                CelProto[fnName] = CelProto[fnName] || function() {
                    return this.invoke(fnName, arguments);
                };
            }).call(CelProto, fnName);

        }
    }
};

      通过下面的调用,把Ext.Element’s prototype复制到Ext.CompositeElementLite’s prototype。

 

Ext.CompositeElementLite.importElementMethods();

 

      Ext.CompositeElement继承实现了Ext.CompositeElementLite,两者的区别就如同Ext.get和Ext.fly的关系
下面看看Ext.CompositeElement中Ext.Element.select方法

 

Ext.Element.select = function(selector, unique, root){
    var els;
    if(typeof selector == "string"){//css表达式形式
    	//Ext.Element.selectorFunction实际上是Ext.DomQuery.select函数的别名
        els = Ext.Element.selectorFunction(selector, root);
    }else if(selector.length !== undefined){//元素结合的形式
        els = selector;
    }else{
        throw "Invalid selector";
    }
    //构造复合元素,true以Ext.Element形式构件,否则采用Ext.flyweight模式构建
    return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els);
};

     Ext.select可以链式调用,如下代码

 

Ext.select('p')
   .addClass('.cls')
   .on('click',function(){alert(this)});

 

下面看个简单的例子

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>批量操作元素Ext.CompositeElementLite测试</title>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<link rel="stylesheet" type="text/css"
			href="../ext-3.3.1/resources/css/ext-all.css" />
		<script type="text/javascript"
			src="../ext-3.3.1/adapter/ext/ext-base-debug.js"></script>
		<script type="text/javascript"
			src="../ext-3.3.1/ext-all-debug-w-comments.js"></script>
		<script type="text/javascript"
			src="../ext-3.3.1/src/locale/ext-lang-zh_CN.js"></script>
		<script type="text/javascript" src="../ext-3.3.1/src/debug.js"></script>
		<script type="text/javascript">
		        Ext.onReady(function() {
					Ext.BLANK_IMAGE_URL = '../ext-3.3.1/resources/images/default/s.gif';
					Ext.QuickTips.init();
					var els = Ext.select("#some-el div.some-class");
					// or select directly from an existing element
					var el = Ext.get('some-el');
					el.select('div.some-class');
					
					els.setWidth(100); // all elements become 100 width
					els.hide(true); // all elements fade out and hide
					// or
					els.setWidth(100).hide(true);
				});
				function show(){
					var els = Ext.select("#some-el div.some-class");
					els.show();
				}
		</script>
  </head>
  
  <body>
  <div id="some-el">
	<div class="some-class">批量操作元素Ext.CompositeElementLite测试</div>
  </div>
  <input type="button"  onclick="show();" value="显示"> 
  </body>
</html>
分享到:
评论

相关推荐

    深入剖析ExtJS_2.2实现及应用

    作者采用了"core→element→component"的主线,将整个ExtJS源码结构串联起来,确保读者能逐步深入学习,理解每一层的细节。 "Introduction"章节为初学者提供了入门指导,涵盖了ExtJS的基本概念和安装步骤。"Core...

    深入剖析ExtJS 2.2实现及应用连载(全集) DOC精排版!

    本书还深入探讨了JavaScript技术,特别是针对ExtJS源码分析所需的JS知识点。虽然不完全是针对JavaScript初学者,但对于进阶开发者,它提供了许多其他书籍中未涉及的内容,如正则表达式的解析原理和高效正则编写,...

    ExtJS中文手册.pdf

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

    ExtJS3.0深入浅出(书)源码

    **二、源码分析** 书中对ExtJS 3.0的源码进行了深入解析,帮助读者理解其内部工作原理。这包括: 1. **核心类库**:讲解了Ext的基础类,如Element、Component、Store、Grid等,这些是构建所有组件的基础。 2. **...

    【JavaScript源代码】EXTJS7实现点击拖拉选择文本.docx

    在EXTJS7中,开发人员有时需要允许...通过以上分析,我们可以了解到EXTJS7中实现点击拖拉选择文本的机制,以及如何在组件级别和子元素级别进行配置。开发者可以根据实际需求灵活地调整这些配置,以提供更好的用户体验。

    读Ext之十五(操作批量元素)

    在IT行业中,JavaScript库ExtJS是一个广泛使用的前端框架,它为构建复杂的...因此,深入学习"读Ext之十五(操作批量元素)"这篇博客,并结合`CompositeElementLite.js`的源码分析,将是提升ExtJS开发能力的关键步骤。

    ext-3.0.0源码

    EXTJS 3.0.0源码的分析可以帮助我们深入理解其工作原理,从而更好地利用这个框架来开发复杂的Web应用。 EXTJS的核心是组件模型,它包括各种可复用的UI组件,如表格、面板、表单、树形视图、菜单等。在EXT 3.0.0中,...

    深入剖析EXT 2.2及应用

    书中的内容结构严谨,以"core"(核心)、"element"(元素)和"component"(组件)这三个关键词为主线,串联起EXTJS的整个源码体系。同时,通过一个网络办公系统的实例,将各个知识点贯穿起来,使读者能够逐步学习并...

    EXTJS经典教程

    - **Element对象**:Ext的核心概念之一,用于操作DOM元素,提供了丰富的API来进行DOM操作,如获取、设置样式、位置等。 - **获取多个DOM的节点**:可以通过CSS选择器获取多个DOM节点,并进行批量操作。 - **响应...

    EXT中文手册,ext开发帮手

    手册通常包括EXT的基本概念、安装和下载步骤、组件的使用方法、事件处理、Ajax通信、源码分析等多个章节。其中,"EXT简介"部分会介绍EXT的基本理念和架构;"下载EXT"则会指导开发者如何获取EXT库并将其引入项目;...

    ext js中文开发手册

    源码分析涉及组件架构、事件处理流程、数据绑定机制等方面,对于定制高级功能和调试问题尤为重要。 **九、程序规划入门** 在使用EXT JS进行项目开发前,合理的规划至关重要。这包括选择合适的布局、定义组件层次、...

    asp.net ext 中文手册

    源码分析可以帮助开发者更好地掌握框架的工作原理,从而更有效地进行调试和优化。源码概述章节通常会介绍EXT的架构设计、关键模块的功能及其实现方式,以及在发布源码时需要注意的细节,如依赖管理、代码结构和最佳...

    EXT-js-中文手册

    - **源码分析**:深入分析EXT的源码结构,帮助开发者理解其内部机制。 - **细节讲解**:特别关注了在发布EXT源码过程中需要注意的细节问题,如兼容性考虑、性能优化等。 #### 10. EXT程序规划入门 - **准备工作**:...

    EXT 中文手册内具实例代码

    - **案例分析**:通过具体的案例分析,帮助开发者深入理解 Ext 的使用方法。 综上所述,《EXT 中文手册》涵盖了 Ext 框架的基础知识、核心概念、高级功能以及实际应用案例,对于想要掌握 Ext 开发的读者来说是一份...

Global site tag (gtag.js) - Google Analytics