首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

CSS选择器实现原理解决方案

2012-02-22 
CSS选择器实现原理自从JQuery实现了Selector后,貌似其他一些JavaScript框架也开始向Selector靠拢,相继推出

CSS选择器实现原理
自从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

[解决办法]
很好很强大,
关注~
[解决办法]
瞅瞅。
[解决办法]
关注....
[解决办法]
up,jf
[解决办法]
关注中.....
[解决办法]
有用
[解决办法]
MARK!
[解决办法]
学习~
[解决办法]
学学嘻嘻
[解决办法]
学习...
[解决办法]
学习 收藏 蹭分
[解决办法]
学习了,谢谢楼主分享
[解决办法]
啥时候IE6能完全兼容CSS2.0标准就好了,希望浏览器大一统啊。

不然再好的CSS知识都是惘然,太累太辛苦。
[解决办法]
学习
[解决办法]
了解
[解决办法]
收藏...
[解决办法]
up
[解决办法]
好东西学习一下
[解决办法]
同意楼上
[解决办法]
谢谢LZ分享,顶。。。
[解决办法]
谢谢 LZ写的只是最基本的一部分
我写了一个CSS3选择器JS实现 http://github.com/xfsn/lix/tree/master


W3C的CSS3选择器说明http://www.w3.org/TR/css3-selectors/
[解决办法]

[解决办法]
对了说一句 现在新出的浏览器,包括IE8都支持querySelector和querySelectorAll这两个原生的CSS选择器
[解决办法]

[解决办法]
都向选择器发展了.
[解决办法]
jQuery 的 selecter 是我选择它的主要原因之一. 
另一个则是 ajax 部分.

其它倒用得相当少..
[解决办法]
MARK
[解决办法]
看不懂
[解决办法]
顶 !!!!
[解决办法]
学习
[解决办法]

探讨
引用:
啥时候IE6能完全兼容CSS2.0标准就好了,希望浏览器大一统啊。

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


IE6素木有指望鸟,只能希望它的市场份额快点消失~~~````

[解决办法]
~jF
[解决办法]
谢谢 收藏了
[解决办法]
好,收藏了
[解决办法]

[解决办法]
学习 学习
[解决办法]
学习共进
[解决办法]
很长时间了打不开库,还在LOADING XML,还有其它路径?
LZ的图象雷人得很呢,哈哈 ...
[解决办法]
探讨
引用:
jQuery 的 selecter 是我选择它的主要原因之一.
另一个则是 ajax 部分.

其它倒用得相当少..



不过说实话,从自己的实现方式来看,用selector的效率太低下了,不是项目紧张或者完全不懂JavaScript的人还是不要用它了。

[解决办法]
学习一下。
[解决办法]
学习一下,很不错
[解决办法]
太复杂
[解决办法]
感谢 急用
[解决办法]
做个记录先
[解决办法]
.
[解决办法]
学习
[解决办法]
up
[解决办法]
学习、了解了!
[解决办法]
收藏
[解决办法]
好东西啊...
[解决办法]
拿走 谢谢
------解决方案--------------------


很好 很经典
[解决办法]
mark
[解决办法]
顶~~
[解决办法]
mark
[解决办法]
ding
学习下
[解决办法]
学习~谢:)
[解决办法]
关注中
[解决办法]
up

热点排行