写代码过程中,发现使用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的更多相关文章

  1. 关于jquery ID选择器的一点看法

    最近看到一道前端面试题: 请优化selector写法:$(".foo div#bar:eq(0)") 我给出的答案会是: 1. $("#bar") 2.  $( ...

  2. jQuery选择器引擎和Sizzle介绍

    一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...

  3. [转]JQuery - Sizzle选择器引擎原理分析

    原文: https://segmentfault.com/a/1190000003933990 ---------------------------------------------------- ...

  4. jQuery源码分析系列(三)Sizzle选择器引擎-下

    选择函数:select() 看到select()函数,if(match.length === 1){}存在的意义是尽量简化执行步骤,避免compile()函数的调用. 简化操作同样根据tokenize ...

  5. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理

    这一节要分析的东东比较复杂,篇幅会比较大,也不知道我描述后能不能让人看明白.这部分的源码我第一次看的时候也比较吃力,现在重头看一遍,再分析一遍,看能否查缺补漏. 看这一部分的源码需要有一个完整的概念后 ...

  6. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析

    jQuery源码9600多行,而Sizzle引擎就独占近2000行,占了1/5.Sizzle引擎.jQuery事件机制.ajax是整个jQuery的核心,也是jQuery技术精华的体现.里面的有些策略 ...

  7. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析

    Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...

  8. Sizzle选择器引擎介绍

    一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...

  9. jQuery基本选择器模块(二)

    选择器模块 1.push方法的兼容性(了解) 问题:IE8不支持aplly方法中的第二个参数是 伪数组 目标:实现 push 方法的浏览器兼容性问题 var push = [].push; try { ...

随机推荐

  1. window.location.href 和 document.location.href

    document表示的是一个文档对象,window表示的是一个窗口对象,一个窗口下可以有多个文档对象. 所以一个窗口下只有一个window.location.href,但是可能有多个document. ...

  2. mysql 不同语法

    http://blog.csdn.net/kesaihao862/article/details/6718443 REPLACE INTO id_28_repayid(stub) VALUES(1); ...

  3. javascript中最常用的方法

    平时在工作中时常需要一些方法,下面列举几个最常用的几个方法. 1. indexOf(searchvalue,fromindex) 该方法用于查找一个字符串是否包含了另一个字符串 indexOf() 方 ...

  4. Spring动态数据源的配置

    Spring动态数据源 我们很多项目中业务都需要涉及到多个数据源,就是对不同的方法或者不同的包使用不同的数据源.最简单的做法就是直接在Java代码里面lookup需要的数据源,但是这种做法耦合性太高, ...

  5. Qt编译Oracle OCI驱动

    最近使用qt开发了一个访问数据库的工具, 默认使用ODBC驱动注入的方式,后来发现Oracle中ODBC驱动注入经常失败. 后来就想直接使用OCI方式访问,而默认情况下Qt只有Sqlite和ODBC驱 ...

  6. 如何针对已经安装好的Apache/PHP/Mysql/Nginx程序查看他们的编译参数

    我们经常要对我们已经安装好的程序进行查看他当时的一些编译参数,特别是针对要安装多台服务器来说,而且要保证其他服务器上的软件版本和安装参数必须一致时,这种查看就是很有必要的了.具体查看各程序的编译参数命 ...

  7. 怎样简单的制作一个CHM格式的帮助文档?

    http://jingyan.baidu.com/article/d8072ac446eb7bec95cefd0e.html 怎么制作CHM格式电子书 http://jingyan.baidu.com ...

  8. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  9. Swing 布局时 组件大小问题

    在JFrame中放置了几个JPanel ,想调整JPanel大小,一直无效. 问题在于: 因为JPanel A的四周没有添加任何组件,所以JPanel B会把JPanel A填满.这种情况想固定JPa ...

  10. javascript 备忘录

    JS语法 javascript 对象: var cars=new Array("Audi","BMW","Volvo"); 声明变量类型 当 ...