`
yiminghe
  • 浏览: 1463214 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一种基于匹配回朔的 css3 选择器引擎实现

 
阅读更多

一种基于匹配回朔的 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

解析后的链表为:

linkedlist

引擎查找

接下来的工作就是引擎查找,查找过程比较复杂,下面根据以下流程图结合实例讲解:

engine

举例选择器字符串为:

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 的部分,经过少量调整,全部通过:

selector - sizzle 测试

性能测试

kissy-selector-sizzle

欢迎提交新的例子。

分享到:
评论

相关推荐

    CSS选择器.pdf

    在CSS选择器的体系中,存在多种不同类型的选择器,每种都有其特定的用途和使用场景。 首先,元素选择符是最基本的类型,包括通配符选择器、标签选择器、id选择器和class选择器。通配符选择器用“*”表示,可以选中...

    CSS3选择器

    CSS3 选择器 CSS3 选择器是 CSS 中用来选择 HTML 元素的方式,基本涵盖了 CSS 2 和 CSS 3 的所有规定。下面是 CSS3 选择器的详细知识点: 一、基本选择器 基本选择器是选择 HTML 元素的基本方式。有以下几种: *...

    HTML5&CSS3网页制作:CSS基础选择器.pptx

    为了巩固所学,你可以尝试一个练习,使用上述四种不同的选择器来实现一个简单的样式效果,例如设置标题颜色、段落字体、链接样式以及一个特殊ID元素的背景色。这样可以帮助你更好地理解和应用CSS基础选择器。

    让IE支持CSS3选择器的插件

    总的来说,"IE-Css3.Js"插件为开发者提供了一种解决IE浏览器与CSS3兼容性问题的解决方案,使得在旧版IE浏览器上也能实现现代网页设计的效果。然而,随着现代浏览器的普及,以及对老旧浏览器支持需求的减少,开发者也...

    ie-css3.js 让IE支持高级CSS3选择器.zip

    **CSS3选择器** 是一种增强的CSS语法,允许更精确地定位和操作HTML或XML文档中的元素。例如,它们包括伪类(如`:hover`、`:active`和`:focus`),伪元素(如`::before`和`::after`),以及基于属性的和子选择器(如`...

    css的选择器

    本文档基于W3School的资料进行整理,旨在详细介绍各种类型的CSS选择器及其使用方法。 #### 二、选择器类型 ##### 1. **类与ID选择器** **类选择器**:使用`.`来表示。类选择器可以被多次使用在不同的HTML元素上,...

    css3和h5实现王者荣耀官网

    1. **选择器增强**:CSS3引入了更精确的选择器,如属性选择器、伪类选择器和兄弟选择器,使得样式控制更为灵活。例如,我们可以利用`:nth-child()`来对网页中的元素进行特定排序和样式设定。 2. **过渡与动画**:...

    css选择器的应用

    ### CSS选择器的应用 #### CSS概述与引入方式 CSS(层叠样式表)是一种用于定义HTML文档中元素样式的语言。它允许开发者控制网页布局、颜色、字体等外观特性,从而增强网页的表现力。CSS可以通过多种方式引入: -...

    python爬虫之css选择器

    CSS选择器是CSS用来匹配HTML元素的一种方式。通过这些选择器,我们可以精确地选取页面中的元素,并对其应用样式。在爬虫开发中,我们同样可以利用这些选择器来定位和提取我们需要的数据。 #### 三、CSS选择器分类及...

    CSS的选择器内容文档

    #### CSS选择器的重点内容详解 **CSS(Cascading Style Sheets)**,即层叠样式表,是一种用来表现HTML或XML等文件样式的计算机语言。CSS选择器则是用于匹配HTML文档中的元素和它们的属性。通过选择器,我们可以为...

    农产品网页美化-CSS3选择器.pptx

    CSS3新增了三种属性选择器: - `E[att^=value]`:选择器匹配具有att属性且其值以"value"开头的E元素。 - `E[att$=value]`:选择器匹配具有att属性且其值以"value"结尾的E元素。 - `E[att*=value]`:选择器匹配...

    HTML5&CSS3网页制作:属性选择器.pptx

    其中,属性选择器是CSS3引入的一种高级选择器,极大地增强了对元素样式的控制能力。 属性选择器根据元素的属性及其属性值来选择元素,这使得我们可以无需额外添加class或id就能实现特定的样式应用。CSS3中新增了三...

    CSS选择器和jQuery选择器

    本文将深入探讨两种常用的选择器——CSS选择器和jQuery选择器,并通过具体的例子来帮助读者更好地理解和掌握它们。 #### 二、CSS选择器 CSS选择器是CSS的核心功能之一,用于定义哪些HTML元素应该应用特定的样式。...

    十种CSS选择器详解介绍

    ### 十种CSS选择器详解介绍 #### 一、通用选择器 - **定义**: 通用选择器使用星号 `*` 来表示,能够匹配HTML文档中的每一个元素。 - **示例**: ```css * { margin: 0; padding: 0; } ``` - **用途**: 常用于...

    HTML CSS选择器

    通过以上介绍可以看出,CSS选择器为开发者提供了强大的工具来控制页面元素的样式。无论是简单的标签选择器还是复杂的组合选择器,每种选择器都有其独特的作用和适用场景。正确理解和灵活运用这些选择器能够帮助我们...

    jquery CSS和xpath选择器.pdf

    本文将深入探讨jQuery中的CSS选择器和XPath选择器,帮助开发者更好地理解和利用这些工具。 一、jQuery CSS选择器 1. 基本选择器: - `*` 选择所有元素。 - `E` 选择指定类型的元素,如`div`,`p`等。 - `E:nth-...

    css选择器练习代码1

    本练习代码1着重于深入理解和实践CSS选择器,以提升网页设计和布局的精准度。下面将详细讨论CSS选择器的基本类型、用法以及它们在实际开发中的应用。 1. **基础选择器** - **类型选择器**:如`h1`,`p`等,基于...

    Jquery css选择器

    在网页开发中,CSS选择器是一种强大的工具,用于选择HTML文档中的元素,并应用于样式规则。本文将深入探讨Jquery CSS选择器的重要特性,特别是属性选择器、子选择器以及兄弟组合选择器的应用。 #### 二、属性选择器...

    CSS选择器.docx

    CSS选择器是一种用于定位和选择HTML文档中要应用样式的元素的机制。它们可以精确地选择需要样式化的元素,并根据这些选择来应用CSS样式规则。以下是对CSS选择器的详细介绍: 一、基本选择器 通用选择器(*): 匹配...

Global site tag (gtag.js) - Google Analytics