css selector dom 实现的常见步鄹:
(from Secrets of the JavaScript Ninja)
1.解析 selector 字串
如根据 \s+ 将 "div span a" 分解为 [div,span,a]
2.获取元素
如上例,先由 getElementsByTagName 得到所有的 div ,再在 div 数组中得到 所有的后代 span
3.过滤元素
由于 div 可能有后代 div ,所以 按照 2 步得到的 span 集合 ,会有重复元素,需要unique 操作,去除重复的span
4.递归与合并
上述每步我们只处理一个标签,得到结果,那么剩下标签的处理则可以递归处理,得到的结果则要与递归前的结果合并。
根据上述步鄹直觉写出的例子:
function find(selector, root){
root = root || document;
//解析
var parts = selector.split(""),
query = parts[0],
rest = parts.slice(1).join(""),
//获取元素
elems = root.getElementsByTagName( query ),
results = [];
for ( var i = 0; i < elems.length; i++ ) {
if ( rest ) {
//合并,注意还要过滤
results = results.concat(
//递归
find(rest, elems[i]) );
} else {
results.push( elems[i] );
}
}
return results;
}
上述程序有几个问题:
1.同一个selector多次使用,没有任何效率提升,即没有使用缓存机制
2.递归处理效率不高,每次合并+过滤非常耗费时间
DomQuery
:
extjs 对于 selector 的处理十分巧妙,不是简单的 online分析 selector 字串,对于以上问题有自己的解决之道,
类似于 Ext.template
,Extjs 非常创意的将 css selector编译为一系列 的dom 操作调用所组成的动态生成函数,如:
alert(Ext.DomQuery.compile("div span a"));
//解析 selector 字串在编译期已经做了
//递归也不需要,直接生成调用序列
function (root) {
var mode;
++batch;
var n = root || document;
//获取元素
n = getNodes(n, mode, "div");
mode = "";
n = getNodes(n,mode, "span");
mode = "";
n = getNodes(n, mode, "a");
//过滤元素
return nodup(n);
}
可见 extjs 的处理方式 省去了
1.解析 selector 开销
2.递归开销
并且编译形成的函数可以和 selector 字串关联起来,可以缓存了.
现在关键就是 extjs 的 compile过程了,有空再说吧。
注:
1.w3c 有新标准 css selector ,querySelector 与 querySelectorAll IE6,7 not supported
2.w3c以前的标准:xpath 语言与 css selector 不同,复杂难用,需要程序做中间层将 css selector
转换成对应的 xpath
3.Ext selector engine 原来叫 DomQuery ,出来时比当时的 jquery 快好多,ejohn 和 jack 有过一段争论,很有意思,有兴趣可以搜搜看
分享到:
相关推荐
1. **jQuery**: - jQuery是目前最广泛使用的JavaScript库之一,以其简洁的API和跨浏览器兼容性而闻名。 - 其核心功能包括DOM操作、事件处理、动画效果和Ajax交互。 - `$(selector).action()` 是jQuery的典型语法...
- **CSSSelector性能**: 早期版本中CSSSelector的性能略低,但在后续版本中得到了显著提升。 #### 二、Mootools **主页**: **设计思想**: - **面向对象**: Mootools采用了面向对象的设计思想。 **优点**: - **...
EXTJS 提供了选择和操作一组DOM元素的工具,例如 `Ext.query` 方法,它类似jQuery的 `$(selector)`,可以选取符合CSS选择器的元素集合。 响应事件: EXTJS 支持事件驱动编程,允许开发者为组件添加事件监听器。例如...
《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计...
1. 引入所需的CSS和JavaScript文件。 2. 在ExtJs的配置对象中定义MultiselectItemSelector组件,设置其属性,如宽度、高度、数据源等。 3. 在应用的布局中插入该组件。 4. 处理用户的选择变化,可能需要监听组件的`...
#### 1. Ext 类 (P.2) - **概述**:`Ext` 是 ExtJS 的核心命名空间,包含了全局的方法和属性。 - **用途**:提供了一个统一的入口来访问 ExtJS 库的功能,如创建组件、管理事件等。 - **常用方法**: - `Ext.create...
《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计...
- `Ext.DomQuery.select(selector)`:选择符合指定CSS选择器的所有元素。 - `Ext.DomQuery.selectNode(selector, context)`:选择符合指定CSS选择器的第一个元素。 #### 九、Ext.DomHelper类(第14页) - **概述*...
3. `Ext.select(String/Array selector, [Boolean unique], [HTMLElement/String root])`:用于选择一组匹配CSS选择器的DOM元素。可以返回一个Ext.CompositeElement对象,可以对一组元素进行批量操作。 4. `Ext....
它的工作原理类似于jQuery的`$(selector)`,通过传入一个CSS选择器,`Ext.select()`能够返回匹配该选择器的所有元素的数组。这些元素可以是EXTJS组件,也可以是普通的HTML元素。在EXTJS中,你可以利用这个方法来操控...
例如,我们可以使用`$(selector).val()`获取或设置输入框的值,利用`$.trim()`去除字符串两侧的空白,结合正则表达式进行数据有效性检查。同时,jQuery提供`$(element).addClass/removeClass()`来添加或移除类名,...
1. `compile(String selector, [String type]) : Function`:编译选择器表达式为一个函数,用于高效地执行查询。`type`可选参数为'select'(默认)或'simple',分别对应复杂和简单的查询。 2. `filter(Array el, ...
1. **元素选择器**:jQuery 提供了一系列CSS选择器,如ID选择器(#id)、类选择器(.class)、元素选择器(element)等,使得开发者能够轻松定位到网页上的特定元素。 2. **DOM操作**:jQuery简化了DOM(Document Object ...
1. **jQuery 简介** - **DOM操作**:jQuery 提供了一套流畅的语法来选择、遍历和操作HTML元素,例如`$(selector).function()`,这大大简化了对文档对象模型(DOM)的操作。 - **事件处理**:jQuery 使绑定和触发...
在`EXT核心API详解(三)-Ext.Element.txt`中,你将了解到如何选择元素、添加和移除CSS类、处理事件、动画效果以及布局调整。 2. **Array, Date, Function, Number, String**: 在`EXT核心API详解(二)-Array Date ...
#### 六、Dom Selector 为了更灵活地选择DOM元素,Ext 2.0引入了一个强大的DOM选择器,允许开发者使用类似于CSS的选择器语法来选取元素。这为DOM操作带来了极大的便利性和灵活性。 #### 七、总结 通过本文的介绍,...
2. Selector API:Prototype引入了类似于CSS选择器的API,如`$$()`,可以方便地选取DOM元素集合,极大地提高了DOM操作的效率。 四、Ajax支持 1. Ajax对象:Prototype提供了一个全面的Ajax解决方案,包括`Ajax....
1. **选择器(Selector)**:允许开发者通过类似CSS的选择器语法轻松选取页面中的DOM元素。 2. **DOM遍历**:提供方法来遍历DOM结构,例如可以方便地找到某个元素的所有子节点或父节点,以及兄弟节点。 3. **DOM...