十六.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 = ...
随机推荐
- 20165210 《网络对抗技术》week1 exp0 kali安装与配置
20165210 <网络对抗技术>week1 exp0 kali安装与配置 1. 安装过程: 从kali官网上下载如下图所示: 下载完成后打开VMware 点击创建新的虚拟机 弹出新虚拟机 ...
- c# 数据库批量插入数据SqlBulkCopy 示例
/// <summary> /// 批量插入数据 /// </summary> public static void SqlBulkInsert(DataTable dt, s ...
- oracle的JOB
前文再续,上面说的oracle的JOB,近期有些体会,记录一下: 零.创建JOB 创建JOB 1)创建一个存储过程.逻辑处理都在这个存储过程里面. 2)创建一个JOB运行此存储过程 -- 创建tabl ...
- JSON Schema(模式)
JSON Schema指的是数据交换中的一种虚拟的“合同”. JSON验证器负责验证语法错误,JSON Schema负责提供一致性检验. JSON Schema是数据接收方额第一道防线,也是数据发送方 ...
- JMter请求参数中文显示乱码
如上图所示,上传的参数为中文的时候,显示不出来,解决方法如下: 1.进入Jmter安装文件bin文件夹,找到文件jmeter.properties 2.在该文件找到jsyntaxtextarea.fo ...
- oracle管道函数的用法
oracle管道函数是一类特殊的函数,oracle管道函数返回值类型必须为集合,下面将介绍oracle管道函数的语法. 在普通的函数中,使用dbms_output输出的信息,需要在服务器执行完整个函数 ...
- Linux下nginx安装与配置
部分Linux发布版的默认安装已经集成了nginx,查看方法ls /usr/local,若已有nginx文件夹说明已集成. nginx依赖库pcre与zlib,且pcre依赖于gcc与gcc-c++, ...
- Redis学习总结之一——Redis初入
Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是一个key-value存储系统. ...
- Git-Svn 建立工作目录
使用Git-SVN 建立工作目录 GIT-SVN可以以SVN的版本为基础, 实现”私有”的版本管理功能. 这样一些不成熟但又需要记录的版本就不必提交到SVN上, 而只在自己本地私有的版本里出现. 下面 ...
- linux自学(二)之centos7镜像安装
上一篇:linux自学(一)之vmware虚拟机安装 虚拟机安装完成之后,就可以安装centos镜像了 centos官网:https://www.centos.org/ centos7镜像 由于我的电 ...