十六.jQuery源码解析之Sizzle设计思路.htm
为了便于后面的叙述,需要了解一些相关术语和约定.
并列选择器表达式:"div,p,a"====>div,p,a是并列的.
块表达式:"div>p"中的div和p就是两个块.
块表达式的类型:共8种.id,class,name,attr,tag,child,pos,pseudo(伪类表达式)
块间的关系符:共4种.">":父子关系,"+":紧挨着的兄弟关系,"~":后面的所有兄弟关系," ":所有后代关系
设计思路:以"div.guo>p"为例.
1.从左向右:先查找"div.guo"匹配的元素集合,然后查找子元素中是"p"的元素.
2.从右向左:先查找"p"匹配的元素集合,然后检查其中每个元素的父元素是"div.guo"的元素.
无论是从哪种思路,都必须经过以下几个步骤.
1.首先要能正确的解析出div.guo>p中的div.guo,p,>;即解析出选择器中的表达式块和块间的关系符.这一步是必须的.,否则根本无法下手.
2.查找出各个表达式块的元素集合,即div.guo和p的两个模块集合.div.guo同时又分为div模块和.guo两个模块.
3.最后来处理各个模块的关系.即关系符">";
这一步中的从左到右和从右到左是截然不同的两种效果.
a.从左到右:找到div.guo匹配的元素集合的子元素集合,然后从中过滤出匹配"p"的子元素集合.
b.从右到左:检查每个匹配"p"的元素的父元素是否匹配"div.guo",只保留匹配的元素.
根据前面的分析思路,得出以下结论:
1.从左到右的总体思路是不断缩小上下文,即不断缩小查找范围.
2.从右到左的总体思路是先查找后过滤.
3.在从左到右的查找过程中,每次处理块间关系符时都需要处理未知数量的子元素或后代元素,而在从右向左的查找过程中,
处理块间关系符时只需要处理单个父元素或有限数量的祖先元素.因此,在大多数情况下,采用从右到左的查找方式效果要高于从左向右.
在了解了上面的分析后,在来看看Sizzle,他是一款从右向左查找的选择器引擎.
Sizzle提供了三个核心的接口:
1.chunker正则负责从选择器表达式中提取块表达式考核块间关系符.
2.Sizzle.find(expr,context,isXML)负责查找块表达式匹配的元素集合,方法Sizzle.filter(expr,set,inplace,not)负责用块表达式过滤元素集合;
3.对象Sizzle.selector.relative中的块间关系过滤函数根据块间关系符过滤元素集合.
函数Sizzle(selector,context,results,seed)将上面三个核心接口组织起来.
十六.jQuery源码解析之Sizzle设计思路.htm的更多相关文章
- 十五.jQuery源码解析之Sizzle总体结构.htm
Sizzle是一款纯javascript实现的css选择器引擎,它具有完全独立,无库依赖;小;易于扩展和兼容性好等特点. W3C Selectors API规范定义了方法querySelector() ...
- 十二.jQuery源码解析之.eq().first().last().slice()
eq(index):将集合中的索引为index的元素提取出来. first():返回集合中的第一个元素. .last():防护集合中的最后一个元素. .slice(start[,end]):返回集合中 ...
- jquery源码解析:代码结构分析
本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94) 定义了一些变量和函数, jQuery = function() ...
- JQuery源码解析(一)
写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
- Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer
Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 目录 Alink漫谈(十八) :源码解析 之 多列字符串编码MultiStringIndexer 0x00 ...
- Alink漫谈(十九) :源码解析 之 分位点离散化Quantile
Alink漫谈(十九) :源码解析 之 分位点离散化Quantile 目录 Alink漫谈(十九) :源码解析 之 分位点离散化Quantile 0x00 摘要 0x01 背景概念 1.1 离散化 1 ...
- Alink漫谈(二十) :卡方检验源码解析
Alink漫谈(二十) :卡方检验源码解析 目录 Alink漫谈(二十) :卡方检验源码解析 0x00 摘要 0x01 背景概念 1.1 假设检验 1.2 H0和H1是什么? 1.3 P值 (P-va ...
- jquery 源码解析
静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...
随机推荐
- [转载]latex插入两栏的图形或表格
转载自:http://blog.csdn.net/huilingwu/article/details/51649250 latex进行两栏排版时,有时会遇到一些宽度较大的图形或表格,没办法挤在一栏中, ...
- iOS 11 实现App在禁止转屏的状态下网页播放器全屏
禁止转屏是这个意思,在General中设置Device Orientation只有竖屏. 要点就是重写UIViewController的以下3个属性方法 系统的全屏视频播放器是AVFullScreen ...
- Selenium实现右键保存图片(Java)
1.代码 public class SaveImage extends TestCase { private WebDriver driver; private Actions action; pri ...
- MySQL之联合索引
以 index(a, b, c) 为例: 语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要) WHERE a=3 只用到了a列 只走了a板子 WHERE a=3 AND b=5 使用了 ...
- Windows7下PHP 7.1搭建开发环境
引言: PHP天生就是用来解决互联网时代的Web语言问题的专业工具,本文将记录在windows上搭建PHP的过程以及其中碰到的问题. 配置版本信息 OS: Windows 7 PHP: 7.1.7-n ...
- [QT]数据库SQLITE使用错误记录
1.仿照创建数据库的例程编写代码,出现以下问题: ① 创建QSqlQuery query; 注意:这里没有将 query 与 QSqlSatabase db, 关联,正确的应该是 : QSqlQu ...
- Java项目中使用Log4J
Log4J下载 官网:http://logging.apache.org/log4j/ Log4J 1.2下载地址:http://logging.apache.org/log4j/1.2/downlo ...
- BZOJ3673 可持久化并查集 by zky 【主席树】
BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...
- 在 Windows 安装期间将 MBR 磁盘转换为 GPT 磁盘
以 UEFI 启动的 Windows 磁盘必须是 GPT 格式.本文将介绍如何在安装 Windows 期间将磁盘从 MBR 转换成 GPT. 特别注意:操作不慎可能丢失所有数据,如果你懂得安装系统的一 ...
- 使用 Task.Wait()?立刻死锁(deadlock)
最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题. 文章作者 林德熙 已经修复了描述: - win10 uwp 异步转同步 ...