- 浏览: 315206 次
- 性别:
文章分类
最新评论
-
i042416:
分析在哪?
angular分析 -
何盆盆:
你好,请问您这是Extjs3还是Extjs4
ExtJs源码分析与学习—ExtJs事件机制(一) -
124753561:
引用引用引用引用引用[u][u][u][u][i][i][i] ...
Subvision SVN 服务端与客户端的安装 -
谷超:
请问一下例子中itext是什么版本的?
利用iText生成word文档例子参考 -
geosmart:
正好要用到执行字符串中方法,学习了
java中利用反射机制实现调用给定为字符串的方法名
元素的查询Ext.DomQuery
该类结合css选择器可以提供高效的查询。首先说一下DOM中对文档元素的查询,主要有以下方法
- document.getElementById(id)
- element.getElementsByTagName(tagName)
DOM对应的6个属性来获取其父、子及兄弟节点的引用
- parentNode 指向其父节点的引用
- previousSibling 指向前一个兄弟节点的引用
- nextSibling 指向后一个兄弟节点的引用
- firstChild 指向其第一个节点的引用
- lastChild 指向其最后一个节点的引用
- childNodes 返回所有子节点的引用的集合
下面看该类中几个主要方法。先看combination过滤器的实现,共有四种模式,分别为EF,E/F(E>F),E+F,E~F,格模式详见程序中的注释和实现。
/** * 实现combination选择器的查询方式 * @param {} ns 要查询的元素或元素集合 * @param {} mode 查询模式 * @param {} tagName 标签名 */ function getNodes(ns, mode, tagName){ var result = [], ri = -1, cs; if(!ns){ return result; } tagName = tagName || "*";//没有指定tagName,默认为所有的元素,注意这里用*来查询所有 //ns参数值为element时,先封装成数组,后续统一处理 if(typeof ns.getElementsByTagName != "undefined"){ ns = [ns]; } if(!mode){//后代选择器,符号值为 " " E F模式,查询E标签下所有标签名为F的后代元素 for(var i = 0, ni; ni = ns[i]; i++){//找到结果集中所有满足的元素 cs = ni.getElementsByTagName(tagName); for(var j = 0, ci; ci = cs[j]; j++){//找到所有满足tagName的后代元素 result[++ri] = ci; } } } else if(mode == "/" || mode == ">"){// E/F 或E>F 模式,查询E标签下所有标签名为F的子元素,只有一层,而EF模式为所有后代元素,会有好几层的查询 var utag = tagName.toUpperCase(); for(var i = 0, ni, cn; ni = ns[i]; i++){ cn = ni.childNodes; for(var j = 0, cj; cj = cn[j]; j++){ if(cj.nodeName == utag || cj.nodeName == tagName || tagName == '*'){ result[++ri] = cj; } } } }else if(mode == "+"){// E+F模式,在E标签下的所有元素集合中,查找每个元素的相邻的后续兄弟元素(只找第一个后续兄弟)中标签为F的元素 var utag = tagName.toUpperCase(); for(var i = 0, n; n = ns[i]; i++){ while((n = n.nextSibling) && n.nodeType != 1); if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){ result[++ri] = n; } } }else if(mode == "~"){// E~F模式,在E标签下的所有元素集合中,查找每个元素的相邻的后续兄弟元素中标签为F的元素 var utag = tagName.toUpperCase(); for(var i = 0, n; n = ns[i]; i++){ while((n = n.nextSibling)){ if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){ result[++ri] = n; } } } } return result; }
接下来看过滤器的实现。Ext.DomQuery中提供了5中过滤方式:id、class、tagName、attribute、pseudo(伪操作根据函数),为此也相应的提供了byId、byClassName、byTag、byAttribute、byPseudo 5个函数来实现,下面主要看byAttribute
/** * * @param {} cs 要查询的元素结合 * @param {} attr 属性名 * @param {} value 属性对应的值 * @param {} op 操作符 * @param {} custom 对于元素属性,采用[],对于css样式则采用{} */ function byAttribute(cs, attr, value, op, custom){ var result = [], ri = -1, useGetStyle = custom == "{", fn = Ext.DomQuery.operators[op],//DOM操作符 a,//根据判断的属性来取得元素对应的属性值或css样式属性值 xml, hasXml; for(var i = 0, ci; ci = cs[i]; i++){ // skip non-element nodes. if(ci.nodeType != 1){//忽略不是元素节点 continue; } // only need to do this for the first node if(!hasXml){ xml = Ext.DomQuery.isXml(ci); hasXml = true; } // we only need to change the property names if we're dealing with html nodes, not XML // html节点的处理 if(!xml){ if(useGetStyle){ a = Ext.DomQuery.getStyle(ci, attr); } else if (attr == "class" || attr == "className"){ a = ci.className; } else if (attr == "for"){ a = ci.htmlFor; } else if (attr == "href"){ // getAttribute href bug // http://www.glennjones.net/Post/809/getAttributehrefbug.htm a = ci.getAttribute("href", 2); } else{ a = ci.getAttribute(attr); } }else{ a = ci.getAttribute(attr); } if((fn && fn(a, value)) || (!fn && a)){ result[++ri] = ci; } } return result; }
下面看select方法:选择一组元素
select : document.querySelectorAll ? function(path, root, type) { root = root || document; if (!Ext.DomQuery.isXml(root)) { try { var cs = root.querySelectorAll(path); return Ext.toArray(cs); } catch (ex) { } } return Ext.DomQuery.jsSelect.call(this, path, root, type); } : function(path, root, type) { return Ext.DomQuery.jsSelect.call(this, path, root, type); },
该函数分为两种情况,如果支持document.querySelectorAll,优先调用该方法返回。调用传入的参数path为选择器,root为开始查询的节点,默认为document。该方法的别名为"Ext.query = Ext.DomQuery.select;"。另外该类也是单例模式,代码实现比较复杂,内部用到了缓存机制,代码中有三个缓存变量
var cache = {}, simpleCache = {}, valueCache = {},
- cache缓存了选择器的编译(compile)结果
- simpleCache缓存了选择器的简单(simple)编译结果
- valueCache 缓存了选择器查询元素的值
发表评论
-
ExtJs源码分析与学习—Ext.ToolTip应用
2011-12-29 14:18 1795源码待分析,先粘一例子备用 // ... -
ExtJs源码分析与学习—遮罩层
2011-09-06 16:49 4731类Ext.LoadMask ... -
ExtJs源码分析与学习—Ext.UpdateManager
2011-09-06 16:12 2133如果想让html页面中任意元素自动局部刷新,而不是整 ... -
ExtJs源码分析与学习—ExtJs元素Element(六)
2011-06-08 10:41 1751批量操作元素Ext.CompositeElementLite ... -
ExtJs源码分析与学习—ExtJs元素Element(四)
2011-06-07 17:17 2941元素的操作Ext.DomHelper ... -
ExtJs源码分析与学习—ExtJs元素Element(三)
2011-06-07 17:06 1003Ext.Element扩展 通过Ex ... -
ExtJs源码分析与学习—ExtJs元素Element(二)
2011-06-07 16:42 2579元素操作核心类Ext.Elemen ... -
ExtJs源码分析与学习—ExtJs元素Element(一)
2011-06-07 15:47 2074从这一节开始 ... -
ExtJs源码分析与学习—工具类Ext.util.TextMetrics
2011-06-07 15:11 2001Ext提供了一个 ... -
ExtJs源码分析与学习—ExtJs事件机制(六)
2011-06-07 11:25 1438最后把涉及到Ext事件的相关类图贴到这里 ... -
ExtJs源码分析与学习—ExtJs事件机制(五)
2011-06-07 11:15 3013最近一直忙着做产品,所以好久没有写文章了,下面接着 ... -
Ext 组件操作总结——会不断完善
2011-05-10 16:36 26481、Ext.Component 该组件在渲染的时候会默认的 ... -
ExtJs表单几种验证与扩展
2011-05-03 16:26 4853首先说明一下表单验证与其相关的一些设置 Ext ... -
ExtJs源码分析与学习—ExtJs事件机制(四)
2011-03-19 23:37 5267ExtJs组件事件——ExtJs自定义事件的处理 ... -
ExtJs源码分析与学习—ExtJs事件机制(三)
2011-03-15 20:20 3170这篇讲ExtJs对事件的管理和调用 Ext ... -
ExtJs源码分析与学习—ExtJs事件机制(二)
2011-03-15 20:15 2518在ExtJs源码分析与学习—ExtJs事件机制( ... -
ExtJs源码分析与学习—ExtJs事件机制(一)
2011-03-15 18:53 2745前面讲了ExtJs核 ... -
ExtJs源码分析与学习—ExtJs核心代码扩展
2011-01-20 19:16 2041前面三篇文章参考作者snandy总结了Ext中核心 ... -
ExtJs源码分析与学习—ExtJs核心代码(三)
2011-01-17 17:29 2119Ext为javascript的一些对象进行了扩展,主要有Str ... -
ExtJs源码分析与学习—ExtJs核心代码(二)
2011-01-17 16:23 1825接上篇 下面介绍Ext.js ...
相关推荐
ExtJS3.0 源码分析与开发实例宝典
资源名称:Ext JS源码分析与开发实例宝典内容简介:本书全面系统地剖析了ExtJS 3.0的架构设计原理。通过对源码的“抽丝剥茧”,读者可以掌握Ext JS架构的精妙,从原理层面用活Ext JS。此外,本书还提出了大量的解决...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
Ext+JS源码分析与开发实例宝典 是extjs3.0的学习书 书得内容很不错。深入解析extjs 资源是pdf文档. 本人自己还做了pdf的完整书签目录,便于方便和阅读. 文档比较大,一共压缩成12卷.需12卷全部下载完。 就第一个...
NULL 博文链接:https://linder0209.iteye.com/blog/865372
Ext+JS源码分析与开发实例宝典 是extjs3.0的学习书 书得内容很不错。深入解析extjs 资源是pdf文档. 本人自己还做了pdf的完整书签目录,便于方便和阅读. 文档比较大,一共压缩成12卷.需12卷全部下载完。 就第一个...
《ExtJS源码分析与开发实例宝典》是一本不错的关于ExtJS开发实践的教程,特附上源码,与各位共享,谢谢。
ExtJS源码分析与开发实例宝典完整版 1、JS画图部分代码在IE8上看不到效果,因为IE8不支持VML。 2、扩展的组件为作者独立完成,仅供学习之用,一些组件并没有经过严格的测试。 如果需要用到项目之中,请自行测试。 ...
ExtJS源码分析与开发实例宝典第五部分
extjs源码分析与实例开发宝典PDF格式
extjs源码分析与开发实例宝典PDF格式文件
extjs源码分析与开发实例宝典part10共10卷
extjs源码分析与实例开发宝典pdf格式电子书第三部分