[JQuery]JQuery选择器引擎Sizzle
写代码过程中,发现使用JQuery选择器时,$('div.tooltip')和$('.tooltip')的结果不一样,怀疑和选择器的代码逻辑有关(事后证明是代码的低级错误,但是从查找原因的过程中,学到了不少东西),于是去学习了下JQuery选择器引擎Sizzle,以及选择器的优先级。
1.Sizzle引擎
在jq1.3之前,选择器采用的是顺序的思维方式,在需要递进匹配时,例如$('div span'),执行的操作是先匹配div标签,再匹配div标签下的span标签,最后返回结果。而Sizzle采用了Right to left的匹配方式,先去搜寻页面所有的span标签,再去匹配父结点,如果是div,则压入数组,否则抛弃;最后返回结果。
从左到右解析和从右到左解析,性能上有多大的差异呢?
以$(‘div .clr > input[name="readme"] + p’)操作来分析:
"一般来说,HTML文档生成的DOM节点数是比较多的,而你书写的选择器selector绝大多数只能匹配到DOM树中较少的节点(否则就是你规则写得太不好了,一次性选择太多DOM节点会影响效率),因此需要有一种算法来快速判断出selector不匹配当前节点。
假设用从左到右的顺序解析:’div .clr > input[name="readme"] + p’,我们需要先找到所有div节点,然后从第一个div节点开始向下找class=”clr”的节点,一直深度下去,遇到不匹配的情况,就必须回溯到一开始搜索的div节点,然后去搜索下个div节点,重复这样的过程。这样的搜索过程对于一个只是匹配很少节点的选择器来说,效率是极低的,因为我们花费了大量的时间在回溯匹配不符合规则的节点。
如果换个思路,我们一开始过滤出跟目标节点最符合的集合出来,再在这个集合进行搜索,大大降低了搜索空间,这思路很赞:从右到左来解析选择器!
还是上边那个选择器,一开始我们把DOM树中所有的p节点找出来,紧接着我们判断这些节点中的前兄弟节点是否符合input[name="readme"]这个规则,这样就又减少了集合的元素,只有符合当前的子规则才会匹配再上一条子规则。
浏览器解析CSS的引擎就是用这样的算法去解析,同理,Sizzle引擎也是如此,并且在源码里边,它判断一个节点是否符合某个规则的行为定义为matcher。"
2.选择器的优先级
如果用1表示标签名选择器的优先级,用10表示类选择器的优先级,用100表示ID选择器的优先级;其余的选择器都是这三类选择器的扩展组合,通过把优先级相加来进行计算。在设置的属性相同时,优先级高的会覆盖优先级低的。
要写出简洁高效的CSS,要注意尽量不要在类选择器和ID选择器前加标签名,否则Sizzle引擎会进行多余的匹配;尽量少的使用层级关系,可以用class代替。
[JQuery]JQuery选择器引擎Sizzle的更多相关文章
- 关于jquery ID选择器的一点看法
最近看到一道前端面试题: 请优化selector写法:$(".foo div#bar:eq(0)") 我给出的答案会是: 1. $("#bar") 2. $( ...
- jQuery选择器引擎和Sizzle介绍
一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...
- [转]JQuery - Sizzle选择器引擎原理分析
原文: https://segmentfault.com/a/1190000003933990 ---------------------------------------------------- ...
- jQuery源码分析系列(三)Sizzle选择器引擎-下
选择函数:select() 看到select()函数,if(match.length === 1){}存在的意义是尽量简化执行步骤,避免compile()函数的调用. 简化操作同样根据tokenize ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理
这一节要分析的东东比较复杂,篇幅会比较大,也不知道我描述后能不能让人看明白.这部分的源码我第一次看的时候也比较吃力,现在重头看一遍,再分析一遍,看能否查缺补漏. 看这一部分的源码需要有一个完整的概念后 ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析
jQuery源码9600多行,而Sizzle引擎就独占近2000行,占了1/5.Sizzle引擎.jQuery事件机制.ajax是整个jQuery的核心,也是jQuery技术精华的体现.里面的有些策略 ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析
Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...
- Sizzle选择器引擎介绍
一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...
- jQuery基本选择器模块(二)
选择器模块 1.push方法的兼容性(了解) 问题:IE8不支持aplly方法中的第二个参数是 伪数组 目标:实现 push 方法的浏览器兼容性问题 var push = [].push; try { ...
随机推荐
- w3c学习总结1
1.根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选项.HTML5 规范声明:应该使用 <h1> - <h6> 来表示标题,使 ...
- 如何解决找不到方法HttpServletRequest.getServletContext() ---- NoSuchMethodError
报错 java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/serv ...
- javascript 中 function bind()
Function bind() and currying <%-- All JavaScript functions have a method called bind that binds t ...
- jquery中如何以逗号分割字符串_百度知道
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- (中等) HDU 4979 A simple math problem. , DLX+重复覆盖+打表。
Description Dragon loves lottery, he will try his luck every week. One day, the lottery company brin ...
- width这样读取出来是一个字符串,并且带有单位,但是offsetwidth返回的是一个数值。
<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <title> ...
- innodb引擎redo文件维护
如果要对innodb的redo日志文件的大小与个数进行调整可以采用如下步骤: 1.关闭mysql mysqladmin -h127. -P3306 -uroot -p shutdown 2.修改配置文 ...
- [转]配置 VIM 的 Go 语言开发环境
本文是针对像我这样的 VIM 小白而写的,所使用的 VIM-GO 插件虽然步骤简单但不够详细,特写此文以做记录和分享.欢迎各位大神纠正补充! 特别说明 本博文不是 Go 语言环境搭建教程,只是 VIM ...
- python threading模块中对于信号的抓取
最近的物联网智能网关(树莓派)项目中遇到这样一个问题:要从多个底层串口读取发来的数据,并且做出相应的处理,对于每个串口的数据的读取我能想到的可以采用两种方式: 一种是采用轮询串口的方式,例如每3s向每 ...
- 可持久化Trie树初步
可持久化Trie树和可持久化线段树很像,依次插入信息,通过减法来进行历史版本查询. 2015年11月27日 bzoj3261 最大异或和 我们需要计算 a[p] xor a[p+1] xor ... ...