选择器引擎涉及相关概念

  

  概念

  以Sizzle的主函数声明为例,来说明引擎的相关概念。

    function Sizzle(selector, context, results, seed) {
//...
}

  种子集seed:如果CSS选择器非常复杂,需要分几步来得到结果,那么第一次得到的元素集合就叫种子集。Sizzle引擎的解析基本上是由右到左,种子集中的一部分就是我们最后得到的元素。如果引擎是由左到右,那么就只是依次查询兄弟与子节点。

  结果集results:选择器引擎最终返回的元素集合,约定要与querySelectorAll得到的一致,没有重复元素且要与DOM树上出现的顺序一致。

  过滤集:选取一组元素后,之后每一步骤要处理的元素集合都可以称为过滤集。比如p.aaa,假设浏览器不支持querySelectorAll,那么就只能通过getElementByClassName获取到.aaa,然后循环判断tagName === 'p'进行过滤。若不支持ClassName,只能通过getElementsByTagName得到种子集,然后通过className进行过滤。显示,前面的方法比较快,因为class肯定少;同理,如果是ID的话就更简单了,因为ID只有一个,所以查找更快。Sizzle中,若不支持高级查询querySelectorAll,会以ID、Class、Tag的顺序查找。

  选择器群组:一个选择符被并联选择器','划分成多个组。

  选择器组:选择器群组被关系选择器划分的第一个分组。

  判断函数

  isXML:XML与HTML文档有很大的差异,没有ClassName、getElementById,并且nodeName区分大小写。

  作者给出了一个相对严谨的判断函数:

    function isXML(doc) {
return doc.createElement('p').nodeName !== doc.createElement('p').nodeName;
}

  contains:判断参数1是否包含参数2,原为IE的私有实现,后来其他浏览器也借鉴了这个方法。

  compareDocumentPosition:判断两个节点的关系,假设A.compareDocumentPosition(B),结果如下图

  Bits    
000000 0 元素一致
000001 1 节点在不同文档
000010 2 节点B在A之前
000100 4 节点A在B之前
001000 8 节点B包含A
010000 16 节点A包含B
100000 32 浏览器私有使用

  

 

  有时候,两个元素关系可能满足两个情况,比如A既包含B,又在B之前,会得到20。

  sourceIndex:旧版本IE不支持compareDocumentPosition,于是jQuery用另外一个IE私有方法实现,该方法会根据元素位置从上到下,从左到右依次+1,比如HTML=0,head=1,body=2...如果元素不在DOM,返回-1。

  节点排序去重

  

 

  切割器

  

  如果选择器字符串过长,包含类、ID、TAG等,需要一个正则来进行切割,比如'.class,div a,span'需要切割成['.class',',','div',' ','a',',','body'],然后根据符号依次进行操作,上下文默认指定为document,发现第一个是类选择器,就调用getElementByClassName;然后碰到并联选择器,将上面的元素放入结果集。接着是标签选择器,调用getElementByTagName。然后碰到后代选择器,这里可以先查看下一个选择器群组是什么,发现是a标签,继续调用getElementByTagName,然后对两个进行过滤。接下来碰到并联选择器,重复上面操作。

  但是对于:nth-child(n+1)、.td[attr^='abc']这种复杂的选择符,需要更先进的切割器。

  其实,一个正则切割机已经无法满足要求,Sizzle中应用了大量正则和Expr预解析函数进行字符串切割,代码非常长,Sizzle大概从800行-2800行都有涉及,就不贴出来了。

JS框架设计读书笔记之-选择器引擎02的更多相关文章

  1. JS框架设计读书笔记之-选择器引擎01

    选择符 选择符是指CSS样式规则最左边的部分,例如 p{},#id{},.class{},p.class{} 等等 总共可以分为四大类: 并联选择器 => 逗号 => $('div,spa ...

  2. JS框架设计读书笔记之-动画

    基础概念 CSS样式可分为两种,一种值接近无限的集合(color,width),一种值只有几种(display),可以进行计算的样式,产生了动画效果.\ 1. 动画的第一步是获得元素的精确样式值. 2 ...

  3. JS框架设计读书笔记之-节点模块

    节点的创建 浏览器提供了多种手段创建API,从流行程度依次是document.createElement.innerHTML.insertAdjacentHTML.createContextualFr ...

  4. JS框架设计读书笔记之-核心模块

    随笔记录一下读书心得 1. 框架模块-核心模块 该模块是框架最先执行的部分,jQuery与vue中都有初始化的代码. 模块的功能主要是:对象扩展.数组化.类型判定.事件绑定和解绑.无冲突处理.模块加载 ...

  5. JS框架设计读书笔记之-小知识

    这一篇写一点小知识 JS中0.1+0.2为什么不等于0.3? 关于这个问题之前也很疑虑,老师也只是笼统的讲这是JS的语言问题,但是内部具体的情况却没有讲,看了书才发现原理如此简单. 简单来讲,计算机识 ...

  6. JS框架设计读书笔记之-异步

    setTimeout/setInterval 1. 如果回调执行时间大于间隔时间,真正的间隔时间会大一些. 2. 存在一个最小的时间间隔,即使seTimeout(fn,0),在IE6-IE8中大概为1 ...

  7. JS框架设计读书笔记之-函数

    这次写一些函数 1.模拟Object.keys方法 Object.keys = Object.keys || function(obj){ var a = []; // a[0],a[1]...分别赋 ...

  8. javascript框架设计(读书笔记)

    我觉得多看几本进阶的书 与其十本书读一遍,不如一本书读十遍 读书的启示: 读好书(看推荐) 精读(重复看) 能读厚书(javascript权威指南) Object.keys Object.keys=O ...

  9. js框架设计1.1命名空间笔记

    借到了司徒正美的写的js框架设计一书,司徒大神所著有些看不太懂,果然尚需循序渐进,稳扎js基础之中. 第一张开篇司徒阐述了种子模块的概念 种子模块亦为核心模块,框架最先执行模块,司徒见解应包含:对象扩 ...

随机推荐

  1. JVM菜鸟进阶高手之路十(基础知识开场白)

    转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...

  2. oracle 数据库(表)的逻辑备份与恢复

    一.介绍逻辑备份是指使用工具export将数据对象的结构和数据导出到文件的过程.逻辑恢复是指当数据库对象被误操作而损坏后使用工具import利用备份的文件把数据对象导入到数据库的过程.物理备份即可在数 ...

  3. SpringAop详解

    近几天学习了一下SpringAop在网上找了一些资料,此链接为原文链接http://www.cnblogs.com/xrq730/p/4919025.html AOP AOP(Aspect Orien ...

  4. 洗礼灵魂,修炼python(2)--python安装和配置

    安装python和基本配置: python官方下载地址:www.python.org 打开网站,然后下载对应(32位和64位,windows版还是linux版)的版本,你可以选择python3或者2, ...

  5. 关于form表单或者Ajax向后台发送数据时,数据格式的探究

    最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求 假设发送的数据是这样的: data = {'s ...

  6. struts2中的Ajax异步校验

    登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...

  7. Java总结篇:Java多线程

    Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...

  8. P60 2.6

    import java.util.Scanner; public class Num { public static void main(String[] args) { Scanner input ...

  9. Elixir游戏服设计五

    在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...

  10. Ubuntu16.04 install eclipse-jee-oxygen-R-linux-gtk-x86_64

    下面如何在Ubuntu16.04 下面怎么下载Java EE并创建在桌面快捷上下载Java EE:eclipse下载Java EE官网:http://www.eclipse.org/downloads ...