CSS选择器实现原理

dh20156 2009-07-09 08:54:16
加精
自从JQuery实现了Selector后,貌似其他一些JavaScript框架也开始向Selector靠拢,相继推出了自己的CSS选择器,考虑到css选择器确实强大,所以,在easyUI中也添加了一个自己的cssSelector方法:easyUI.cssSelector('css选择器',dom范围)

CSS选择器实现原理:

一、解析

1、格式化数据,将css选择器转换成一种便于后面进行操作的格式,这一步很重要,这是数据结构部分,后面的实现都将以此为依据。

以下面数据为例:

#a b.c .d + e:first-child > f[data = "hello world!"]

首先,捕获形如 [ 属性 = 值 ] 的数据,将"="两边的空格去掉,然后将“值”里的空格替换为一个不太可能会出现的临时字串,如0x20156

然后,在+、:、>、[ 符号前加空格

接着,将#、.、+、:、]、>后的空格去掉

最好将单引号和双引号也都去掉

做完上述替换操作后,变可得到形如下面的数据:

#a b.c .d +e :first-child >f [data=hello0xdh20156world!]

2、将格式化后的数据转换成这样的伪代码:取节点函数('css选择符',上一次操作的结果),以空格为分隔:

取节点函数('#a',上一次操作的结果)

取节点函数('b.c',上一次操作的结果)

取节点函数('.d',上一次操作的结果)

取节点函数('+e',上一次操作的结果)

取节点函数(':first-child',上一次操作的结果)

取节点函数('>f',上一次操作的结果)

取节点函数('[data=hello0xdh20156world!]',上一次操作的结果)

3、将css选择器解析成具体的取节点函数,如:

#a应当解析成:document.getElementById('a')

E#a应当解析成:document.getElementsByTagName('E'),然后遍历id=a的

之前进行过转换的0x20156记得重新转换为空格。



更多css Selectors的解释请参见:

http://www.w3.org/TR/CSS2/selector.html


二、编写取节点函数,将伪代码实现

在easyUI.cssSelector的实现中采用的是eval的方式,目前该方法尚未完全支持CSS2选择器,还在测试阶段!


演示:

easyUI Css Selector测试地址:http://www.jslab.org.cn/?tag=cssSelector
...全文
1010 67 打赏 收藏 转发到动态 举报
写回复
用AI写文章
67 条回复
切换为时间正序
请发表友善的回复…
发表回复
antsfee 2012-05-13
  • 打赏
  • 举报
回复
展国,收藏一下
sohighthesky 2009-08-04
  • 打赏
  • 举报
回复
jf,
使用你的那个dhATV的树,显示样式时,出了点问题,能不能帮忙看下啊:http://hi.baidu.com/sohighthesky/album/item/58f5dd3c044d67c73c6d9770.html
这是百度的图片,
maximus_zhang 2009-07-10
  • 打赏
  • 举报
回复
顶~~
mykelly6 2009-07-10
  • 打赏
  • 举报
回复
mark
yangping490215734 2009-07-10
  • 打赏
  • 举报
回复
up
soupred 2009-07-10
  • 打赏
  • 举报
回复
很好 很经典
xiedi1209 2009-07-10
  • 打赏
  • 举报
回复
拿走 谢谢
lwj7891875 2009-07-10
  • 打赏
  • 举报
回复
关注中
Edwingu 2009-07-10
  • 打赏
  • 举报
回复
学习~谢:)
暗夜幽风 2009-07-10
  • 打赏
  • 举报
回复
ding
学习下
cyxin2121921 2009-07-10
  • 打赏
  • 举报
回复
mark
一方晴空 2009-07-09
  • 打赏
  • 举报
回复
好,收藏了
正在加载昵称 2009-07-09
  • 打赏
  • 举报
回复
谢谢 收藏了
dh20156 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 mrshelly 的回复:]
jQuery 的 selecter 是我选择它的主要原因之一.
另一个则是 ajax 部分.

其它倒用得相当少..
[/Quote]

不过说实话,从自己的实现方式来看,用selector的效率太低下了,不是项目紧张或者完全不懂JavaScript的人还是不要用它了。
hookee 2009-07-09
  • 打赏
  • 举报
回复
~jF
街头小贩 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dh20156 的回复:]
引用 14 楼 junyi2003 的回复:
啥时候IE6能完全兼容CSS2.0标准就好了,希望浏览器大一统啊。

不然再好的CSS知识都是惘然,太累太辛苦。


IE6素木有指望鸟,只能希望它的市场份额快点消失~~~````
[/Quote]
9494
wuwu8ku 2009-07-09
  • 打赏
  • 举报
回复
学习
vc_help 2009-07-09
  • 打赏
  • 举报
回复
顶 !!!!
yhjhoo 2009-07-09
  • 打赏
  • 举报
回复
看不懂
dhgdmw 2009-07-09
  • 打赏
  • 举报
回复
MARK
加载更多回复(46)
《jquery技术内幕:深入解析jquery架构设计与实现原理》由阿里巴巴资深前端开发工程师撰写,从源代码角度全面而系统地解读了jquery的17个模块的架构设计理念和内部实现原理,旨在帮助读者参透jquery中的实现技巧和技术精髓,同时本书也对广大开发者如何通过阅读源代码来提升编码能力和软件架构能力提供了指导。   《jquery技术内幕:深入解析jquery架构设计与实现原理》首先通过“总体架构”梳理了各个模块的分类、功能和依赖关系,让大家对jquery的工作原理有大致的印象;进而通过“构造jquery对象”章节分析了构造函数jquery()的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器sizzle、异步队列deferred、数据缓存data、队列queue、浏览器功能测试support;最后详细分析了功能模块的源码实现,包括:属性操作attributes、事件系统events、dom遍历traversing、dom操作manipulation、样式操作css、异步请求ajax、动画effects。   《jquery技术内幕:深入解析jquery架构设计与实现原理》在分析每个模块时均采用由浅入深的方式,先概述功能、用法、结构和实现原理,然后介绍关键步骤和分析源码实现。让读者不仅知其然,而且知其所以然。事实上,本书的根本价值在于传达一种通过阅读源码快速成长的方式。无论是前端新人,还是经验丰富的老手,只要是对javascript感兴趣的开发人员,都会从本书中受益。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧