[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 { ...
随机推荐
- 电子工程师名片——FAT16文件系统(转)
源:电子工程师名片——FAT16文件系统 从8月8号开始,连续一个月利用每天下班时间和周末的时间终于初步完成了一个电子工程师的电路板名片,就像U盘一样,不过这个FLASH只有64KB的大小,用的单片机 ...
- jquery中如何以逗号分割字符串_百度知道
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- AnsiString用法(转)
源:AnsiString用法 //Ansistring 转 char void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiStrin ...
- 超市RFID结算系统项目进度与总结
超市RFID结算系统项目进度与总结 超市RFID结算系统本周末(明天演示),目前进度如下: 一.后台PHP端已经完成了大部分的工作,包括以下: 1.数据库的建立(目前只包括用户表.商品信息表.购物车表 ...
- springMVC+Hibernate配置
本文描述下 sypro 项目中使用 springMVC+Hibernate配置,初学SpringMVC做下简单整理解. 1.web项目首先我们要使用 web.xml文件将 spring配置引入进来 & ...
- 在 WindowMobile 上的模拟LED 显示屏插件(转)
源:在 WindowMobile 上的模拟LED 显示屏插件 我在给一个对话框上的控件查找翻看合适的图标时,无形中看到了一个LED显示屏的图标,这里所说的LED显示屏是指由很多LED灯密集排列组成的点 ...
- 总结分享十大iOS开发者最喜爱的库 分类: ios相关 app相关 2015-04-03 16:43 320人阅读 评论(0) 收藏
该10大iOS开发者最喜爱的库由"iOS辅导团队"成员Marcelo Fabri组织投票选举而得,参与者包括开发者团队,iOS辅导团队以及行业嘉宾.每个团队都要根据以下规则选出五个 ...
- SQLSERVER TRUE、FALSE、UNKNOWN
null和其他值比较都是unknown 在SQL中逻辑表达式的可能值包括TRUE.FALSE.UNKNOWN.他们被称为三值逻辑.三值逻辑是SQL所特有的.大多数的变成语言的逻辑表达式 只有TRUE或 ...
- 查找 SqlServer死锁
use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...
- bitmap 加载的时候出现OOM,nullpointer
1.OOM :对图片进行压缩,效果还不错:http://182.92.150.15:9876/static/server/topic_user/8068/201506/e5b37fec-0919-11 ...