根据上面的分析,我们可以把CSS选择器拆分为两大组成部分,或者说可以把选择器分为以下两类。
第一类,选择器(selector)。即根据给定的选择符,从DOM文档树找到相关的元素节点,并存储到结果集中。
第二类,过滤器(filter)。根据表达式的条件,在结果集中过滤元素。
于是,这里就有一个技术难题:哪些选择符适合选择器(selector),哪些选择符适合过滤器(filter)?
由于可以直接使用document.getElementsByTagName()方法进行选择,因此对于类型选择器来说,直接使用选择即可。
类型选择器相互之间还可以组成各种形式的复合选择器。例如:
广州网站建设,网站建设,广州网页设计,广州网站设计
- *
- E F
- E~F
- E+F
- E>F
- E/F
- E
虽然这些特殊形式的类型选择器由多个选择器构成,但是它们都可以从文档中直接选择,故我们可以统一把它们归为选择器类型。而对于ID选择器和Class选择器来说:
如果它们在selector字符串的起始位置,那么它们也可以完成选择功能。例如$("#id");、$(".calss");。
如果它们不在起始位置,那么就应该作为筛选器实现。例如$("div#id");、$("div.calss");。
实际上,由于ID选择器可以直接调用JavaScript的document.getElementByID()方法进行选择。但是对于Class选择器来说,由于它无法直接进行选择,因此,我们可以把ID选择器视为选择器,而把Class选择器视为过滤器。
对于Class选择器来说,还可以把它转换为"*.class"形式。其中的"*"表示先选取范围内所有的元素,然后再进行过滤,这样就可以实现统一的编程接口。
对于属性选择器、伪类选择器来说,它们只能够附在其他选择器后面使用,如果单独使用,则可以通过在前面添加*标签,以便设计成统一的语法格式,以方便选择器引擎的工作。它们与Class选择器的工作方式是相同的,即都视为过滤器。
例如,对于下面这个复杂的选择器来说,包含了类型选择器、Class选择器、ID选择器、属性选择器和伪类选择器。
广州网站建设,网站建设,广州网页设计,广州网站设计
- $("div.red:nth-child(odd)[title=bar]#wrap p");
jQuery解析的步骤如下。
第一步,选择DOM文档树中所有的p元素,建立初步结果集。
第二步,在结果集中,选择父级元素为div的元素,形成新的结果集。
第三步,在新的结果集中筛选class属性为red的元素。
第四步,解析伪类选择器:nth-child(odd),在结果集中筛选元素的子元素为偶数的元素。
第五步,解析属性选择器 [title=bar],在结果集中筛选元素的title属性为bar的元素。
第六步,在结果集中筛选id等于wrap的元素。



