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

批量操作元素Ext.CompositeElementLite

 

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

 

Js代码    收藏代码
  1. Ext.CompositeElementLite = function(els, root){  
  2.     this.elements = [];  
  3.     this.add(els, root);  
  4.     this.el = new Ext.Element.Flyweight();  
  5. };  

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

 

Js代码    收藏代码
  1. add : function(els, root){  
  2.     var me = this,  
  3.         elements = me.elements;  
  4.     if(!els){  
  5.         return this;  
  6.     }  
  7.     if(typeof els == "string"){  
  8.         els = Ext.Element.selectorFunction(els, root);  
  9.     }else if(els.isComposite){  
  10.         els = els.elements;  
  11.     }else if(!Ext.isIterable(els)){  
  12.         els = [els];  
  13.     }  
  14.   
  15.     for(var i = 0, len = els.length; i < len; ++i){  
  16.         elements.push(me.transformElement(els[i]));  
  17.     }  
  18.     return me;  
  19. },  

 

      该函数根据所传不同参数,处理的会不一样,当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

 

Js代码    收藏代码
  1. transformElement : function(el){  
  2.     return Ext.getDom(el);  
  3. },  

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

 

Js代码    收藏代码
  1. getCount : function(){  
  2.      return this.elements.length;  
  3.  },  

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

 

Js代码    收藏代码
  1. /** 
  2.  * 把Ext.Element.prototype中每一个函数包裹成新的函数,并调用执行 
  3.  * @param {} fn 
  4.  * @param {} args 
  5.  * @return {} 
  6.  */  
  7. invoke : function(fn, args){  
  8.     var me = this,  
  9.         els = me.elements,//元素结合  
  10.         len = els.length,  
  11.         e,  
  12.         i;  
  13.   
  14.     for(i = 0; i < len; i++) {  
  15.         e = els[i];  
  16.         if(e){//对每个元素都执行Ext.Element类的同名函数  
  17.             Ext.Element.prototype[fn].apply(me.getElement(e), args);  
  18.         }  
  19.     }  
  20.     return me;  
  21. },  

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

 

Js代码    收藏代码
  1. Ext.CompositeElementLite.importElementMethods = function() {  
  2.     var fnName,  
  3.         ElProto = Ext.Element.prototype,  
  4.         CelProto = Ext.CompositeElementLite.prototype;  
  5.   
  6.     for (fnName in ElProto) {  
  7.         if (typeof ElProto[fnName] == 'function'){  
  8.             (function(fnName) {  
  9.                 CelProto[fnName] = CelProto[fnName] || function() {  
  10.                     return this.invoke(fnName, arguments);  
  11.                 };  
  12.             }).call(CelProto, fnName);  
  13.   
  14.         }  
  15.     }  
  16. };  

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

 

Js代码    收藏代码
  1. Ext.CompositeElementLite.importElementMethods();  

 

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

 

Js代码    收藏代码
  1. Ext.Element.select = function(selector, unique, root){  
  2.     var els;  
  3.     if(typeof selector == "string"){//css表达式形式  
  4.         //Ext.Element.selectorFunction实际上是Ext.DomQuery.select函数的别名  
  5.         els = Ext.Element.selectorFunction(selector, root);  
  6.     }else if(selector.length !== undefined){//元素结合的形式  
  7.         els = selector;  
  8.     }else{  
  9.         throw "Invalid selector";  
  10.     }  
  11.     //构造复合元素,true以Ext.Element形式构件,否则采用Ext.flyweight模式构建  
  12.     return (unique === true) ? new Ext.CompositeElement(els) : new Ext.CompositeElementLite(els);  
  13. };  

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

 

Js代码    收藏代码
  1. Ext.select('p')  
  2.    .addClass('.cls')  
  3.    .on('click',function(){alert(this)});  

 

下面看个简单的例子

 

Js代码    收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  2. <html>  
  3.   <head>  
  4.     <title>批量操作元素Ext.CompositeElementLite测试</title>  
  5.         <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
  6.         <link rel="stylesheet" type="text/css"  
  7.             href="../ext-3.3.1/resources/css/ext-all.css" />  
  8.         <script type="text/javascript"  
  9.             src="../ext-3.3.1/adapter/ext/ext-base-debug.js"></script>  
  10.         <script type="text/javascript"  
  11.             src="../ext-3.3.1/ext-all-debug-w-comments.js"></script>  
  12.         <script type="text/javascript"  
  13.             src="../ext-3.3.1/src/locale/ext-lang-zh_CN.js"></script>  
  14.         <script type="text/javascript" src="../ext-3.3.1/src/debug.js"></script>  
  15.         <script type="text/javascript">  
  16.                 Ext.onReady(function() {  
  17.                     Ext.BLANK_IMAGE_URL = '../ext-3.3.1/resources/images/default/s.gif';  
  18.                     Ext.QuickTips.init();  
  19.                     var els = Ext.select("#some-el div.some-class");  
  20.                     // or select directly from an existing element  
  21.                     var el = Ext.get('some-el');  
  22.                     el.select('div.some-class');  
  23.                       
  24.                     els.setWidth(100); // all elements become 100 width  
  25.                     els.hide(true); // all elements fade out and hide  
  26.                     // or  
  27.                     els.setWidth(100).hide(true);  
  28.                 });  
  29.                 function show(){  
  30.                     var els = Ext.select("#some-el div.some-class");  
  31.                     els.show();  
  32.                 }  
  33.         </script>  
  34.   </head>  
  35.     
  36.   <body>  
  37.   <div id="some-el">  
  38.     <div class="some-class">批量操作元素Ext.CompositeElementLite测试</div>  
  39.   </div>  
  40.   <input type="button"  οnclick="show();" value="显示">   
  41.   </body>  
  42. </html>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值