一种基于匹配回朔的 css3 选择器引擎实现
介绍
CSS 选择器是一种应用于 DOM 节点查找场景的特定微型语法, 本质上和正则表达式一样都是一种模式匹配语言,灵活使用可以方便得获取指定位置的节点集合。
目前 W3C 推荐标准为 Selectors Level 3 , 在 ie9+ 以及 firefox,chrome,mobile 等浏览器上原生有基本一致的实现,而在 ie 下则需要 使用 javascript 模拟实现,本文介绍一种基于匹配回朔的 css3 选择器引擎实现,特定应用于 ie6,7,8 下。
语法
css 选择器是一种紧凑的语法,根据 css3 规范一个选择器字符串首先由 ',' 号分割的组组成,例如
s = g1,g2
表示匹配 g1 与 g2 的元素集合。组内又由以 ' ','+','>','~' 分割的简单选择器序列组成,例如
g1 = simple1 + simple2
g1 = simple1 simple2
g1 = simple1 > simple2
g1 = simple1 ~ simple2
+
表示 simple1 匹配的元素与 simple2 的在同一层级,且 simple2 的元素紧跟在 simple1 后面。
>
表示 simple2 匹配的元素紧跟在 simple1 的下一层级。
' '
表示 simple1 匹配的元素比 simple2 的层级更靠近根节点。
~
表示 simple1 匹配的元素与 simple2 的在同一层级,且位置靠前。
简单选择器序列又可以由类型选择器以及后缀选择器组成,例如
simple1 = type_selector suffix_selector
其中 typeselector 表示标签的名称,例如 'h1','h2'。不指定时默认为 '*' 表示匹配任何标签。 suffixselector 则一般用来进一步过滤,例如类选择器(限定类名),属性选择器(限定属性),伪类、伪元素等。
例如 h1.x
匹配 <h1 class='x'>
而不匹配 <h1>
或 <span class='x'>
。
完整语法描述可以查看 w3c 标准页面 。
以下文章为了简单描述,将这种语法抽象为
a.b + c.d ~ e.f
其中 a c e 为类型选择器,b d f 为后缀选择器,+ 代表直接位置关系的 > +,~ 代表模糊位置关系的 ~ ' '.
实现
解析器生成
首先把 css 选择器语法用 LALR 解析程序生成器生成解析程序,从而可以把选择器的字符串格式转换成结构化的数据。 这里采用 kison 来生成。
对应 css 选择器语法的 kison 格式描述为: selector-grammar
生成的解析器代码如下: parser.js
流程图如下:
解析后的结构化数据为双向链表格式,例如
a.b + c.d
解析后的链表为:
引擎查找
接下来的工作就是引擎查找,查找过程比较复杂,下面根据以下流程图结合实例讲解:
举例选择器字符串为:
a.b + c.d ~ a + e.f
匹配节点串为:
e.f a.b c.d e c.d e a e.f
获取种子集合
和一般浏览器实现类似,采用自右向左的查找方法,首先要从最右端 的 type selector 获取到种子集合,根据本例为:
a e.f a.b c.d e c.d e a e.f
^ ^ ^ ^
选择器链表分组
将选择器根据直接位置进行分组,以直接位置相连的简单的选择器序列为一组,分组后
a.b + c.d ~ a + e.f
--------- -------
分组的意义在于,每次匹配都以直接位置相连的组为单元做匹配,回朔时也应当以组为单元回朔(直接位置处回朔无意义)。
初步过滤种子
根据最后的一组的选择器序列:
a + e.f
进一步过滤种子集合,过滤后为:
a e.f a.b c.d e c.d e a e.f
^ ^
1 2
进一步过滤种子
这一步会根据对种子进行进一步过滤,过滤过程中甚至会发生回朔。
例如对于第一个种子,在初步过滤后,节点串游标和选择器游标分别在
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
由于节点串游标已经越过节点串头,则表明该次匹配失败,该种子节点匹配失败。
对于第二个种子,在初步过滤后,节点串游标和选择器游标分别在
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
由于匹配失败,但选择器链接为 '~' ,则可不移动选择器游标,而只移动节点串游标:
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
可继续匹配到:
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
此时由于选择器链接为 '+' 因而移动节点串游标已经不可能再次匹配,此时应对选择器游标进行回朔到该分组前面:
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
此时仍然匹配不成功,但可以移动节点串游标为:
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
此时可以匹配选择器游标到头:
a e.f a.b c.d e c.d e a e.f
^
a.b + c.d ~ a + e.f
^
则表明该种子节点符合本次选择器串,最终匹配节点个数为 1
a e.f a.b c.d e c.d e a e.f
^
引擎代码
引擎代码可参见: selector.js
单元测试
单元测试直接拉取 sizzle 对应于 css3 的部分,经过少量调整,全部通过:
性能测试
欢迎提交新的例子。
相关推荐
在CSS选择器的体系中,存在多种不同类型的选择器,每种都有其特定的用途和使用场景。 首先,元素选择符是最基本的类型,包括通配符选择器、标签选择器、id选择器和class选择器。通配符选择器用“*”表示,可以选中...
CSS3 选择器 CSS3 选择器是 CSS 中用来选择 HTML 元素的方式,基本涵盖了 CSS 2 和 CSS 3 的所有规定。下面是 CSS3 选择器的详细知识点: 一、基本选择器 基本选择器是选择 HTML 元素的基本方式。有以下几种: *...
为了巩固所学,你可以尝试一个练习,使用上述四种不同的选择器来实现一个简单的样式效果,例如设置标题颜色、段落字体、链接样式以及一个特殊ID元素的背景色。这样可以帮助你更好地理解和应用CSS基础选择器。
总的来说,"IE-Css3.Js"插件为开发者提供了一种解决IE浏览器与CSS3兼容性问题的解决方案,使得在旧版IE浏览器上也能实现现代网页设计的效果。然而,随着现代浏览器的普及,以及对老旧浏览器支持需求的减少,开发者也...
**CSS3选择器** 是一种增强的CSS语法,允许更精确地定位和操作HTML或XML文档中的元素。例如,它们包括伪类(如`:hover`、`:active`和`:focus`),伪元素(如`::before`和`::after`),以及基于属性的和子选择器(如`...
本文档基于W3School的资料进行整理,旨在详细介绍各种类型的CSS选择器及其使用方法。 #### 二、选择器类型 ##### 1. **类与ID选择器** **类选择器**:使用`.`来表示。类选择器可以被多次使用在不同的HTML元素上,...
1. **选择器增强**:CSS3引入了更精确的选择器,如属性选择器、伪类选择器和兄弟选择器,使得样式控制更为灵活。例如,我们可以利用`:nth-child()`来对网页中的元素进行特定排序和样式设定。 2. **过渡与动画**:...
### CSS选择器的应用 #### CSS概述与引入方式 CSS(层叠样式表)是一种用于定义HTML文档中元素样式的语言。它允许开发者控制网页布局、颜色、字体等外观特性,从而增强网页的表现力。CSS可以通过多种方式引入: -...
CSS选择器是CSS用来匹配HTML元素的一种方式。通过这些选择器,我们可以精确地选取页面中的元素,并对其应用样式。在爬虫开发中,我们同样可以利用这些选择器来定位和提取我们需要的数据。 #### 三、CSS选择器分类及...
#### CSS选择器的重点内容详解 **CSS(Cascading Style Sheets)**,即层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言。CSS选择器则是用于匹配HTML文档中的元素和它们的属性。通过选择器,我们可以为...
CSS3新增了三种属性选择器: - `E[att^=value]`:选择器匹配具有att属性且其值以"value"开头的E元素。 - `E[att$=value]`:选择器匹配具有att属性且其值以"value"结尾的E元素。 - `E[att*=value]`:选择器匹配...
其中,属性选择器是CSS3引入的一种高级选择器,极大地增强了对元素样式的控制能力。 属性选择器根据元素的属性及其属性值来选择元素,这使得我们可以无需额外添加class或id就能实现特定的样式应用。CSS3中新增了三...
本文将深入探讨两种常用的选择器——CSS选择器和jQuery选择器,并通过具体的例子来帮助读者更好地理解和掌握它们。 #### 二、CSS选择器 CSS选择器是CSS的核心功能之一,用于定义哪些HTML元素应该应用特定的样式。...
### 十种CSS选择器详解介绍 #### 一、通用选择器 - **定义**: 通用选择器使用星号 `*` 来表示,能够匹配HTML文档中的每一个元素。 - **示例**: ```css * { margin: 0; padding: 0; } ``` - **用途**: 常用于...
通过以上介绍可以看出,CSS选择器为开发者提供了强大的工具来控制页面元素的样式。无论是简单的标签选择器还是复杂的组合选择器,每种选择器都有其独特的作用和适用场景。正确理解和灵活运用这些选择器能够帮助我们...
本文将深入探讨jQuery中的CSS选择器和XPath选择器,帮助开发者更好地理解和利用这些工具。 一、jQuery CSS选择器 1. 基本选择器: - `*` 选择所有元素。 - `E` 选择指定类型的元素,如`div`,`p`等。 - `E:nth-...
本练习代码1着重于深入理解和实践CSS选择器,以提升网页设计和布局的精准度。下面将详细讨论CSS选择器的基本类型、用法以及它们在实际开发中的应用。 1. **基础选择器** - **类型选择器**:如`h1`,`p`等,基于...
在网页开发中,CSS选择器是一种强大的工具,用于选择HTML文档中的元素,并应用于样式规则。本文将深入探讨Jquery CSS选择器的重要特性,特别是属性选择器、子选择器以及兄弟组合选择器的应用。 #### 二、属性选择器...
CSS选择器是一种用于定位和选择HTML文档中要应用样式的元素的机制。它们可以精确地选择需要样式化的元素,并根据这些选择来应用CSS样式规则。以下是对CSS选择器的详细介绍: 一、基本选择器 通用选择器(*): 匹配...