`
axl234
  • 浏览: 260182 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jquery sizzle 选择器浅析

阅读更多

看了jquery的源码,jquery用的选择器的引擎是sizzle,是jquery的作者另一开源项目,在github上面有,号称最快的dom选择器!不到2000行代码。

  上面说了不是很精彩的开场白,我么来个 for example:     $('.test') 在jquery的流程是怎么走的呢?

  1.首先会做如下的判断

复制代码
/**
*关于 querySelectorAll函数 
*返回当前文档中匹配一个特定选择器的所有的元素
*var nodelist = element.querySelectorAll("div.test");
*支持浏览器  ie8+,Chrome,Firefox(3.5)
* 如果你不清楚可以google 一下
*/
if ( document.querySelectorAll ) {
    (function(){
        var oldSizzle = Sizzle,
            div = document.createElement("div"),
            id = "__sizzle__";

        div.innerHTML = "<p class='TEST'></p>";

        // Safari can't handle uppercase or unicode characters when
        // in quirks mode.
        if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
            return;
        }
    
        Sizzle = function( query, context, extra, seed ) {
            //使用querySelectorAll 来查询
        }
}
复制代码

如果你的浏览器是ie8+ 或者 谷歌,直接通过内置的querySelectorAll(".test")返回dom结构。 如果你使用是ie6,那么下面事情发生了

  2. 不支持querySelectorAll 就会启动内部 sizzle。下面是流程

复制代码
/**
1.sizzle 通过
 chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g
这个正则进行匹配,

2.把我们传来的参数'.test',匹配成'.test' 放到数组

3.检测浏览器是否支持getElementsByClassName 如果支持,则通过此函数返回dom,如果不支持此函数则 context.getElementsByTagName( "*" ) ,通过上下文把所有的元素选出来,在通过循环,选择className = 'test' 的元素,放入数组返回dom。
*/
复制代码

ok,以上是$('.test')的流程,如果你很迷惑,你可以看看源码,调试一下。

  关于sizzle的选择器

  个人认为,sizzle选择器是增强版的querySelectorAll 函数, 因为querySelectorAll 不支持 'div.test :eq(1)' 这样的selector 和css3选择!

当你的selector里面出现nth|eq|gt|lt|first|last|even|odd 这样的字符时候, 从右向左,所谓的从右向左,比如 $('div img')  首先会把所有的img 选出来,通过parent 是div 进行过滤 。 这样很高效的原因是只进行一次dom的查询!

当你selector 出现了nth|eq|gt|lt|first|last|even|odd  这样的字符的时候,从左向右! 所谓从左向右,比如 $('div img:eq(1)')  先把所有的div 选出来保存,在把img选出来通过eq(1)过滤保存, 在对结果集操作,进行多次选择了

分享到:
评论
1 楼 haixin3036 2014-07-16  
jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。http://www.adminwang.com/jquery/对Css3和各种主流浏览器做了兼容性处理.jquery使开发者把更多的精力用到程序的功能实现上,而不是对兼容性等问题的处理.

相关推荐

    jquery 选择器引擎sizzle浅析

    于是看了jquery的源码,jquery用的选择器的引擎是sizzle,是jquery的作者另一开源项目,在github上面有,号称最快的dom选择器!不到2000行代码。上面说了不是很精彩的开场白,我么来个 for example: $(‘.test’) 在...

    jQuery源码分析之sizzle选择器详解

    jquery从1.3开始,使用了新的选择器–sizzle。效率超过了以前的jquery版本的其他选择器。下面这篇文章主要介绍了jQuery源中sizzle选择器的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析

    近期看了一些网上关于Sizzle的分析文章,就匹配次序往往就说使用了从右到左的逆向匹配法,...在此先申明一点,下面所说的关系选择器是指W3C中的Combinator选择器,因本人觉得用关系选择器这个名字要比其它更加贴近实际

    jQuery中的Sizzle引擎分析

    在 http://www.cnblogs.com/strick/p/5078435.html 有描述

    jQuery常规选择器源码

    jQuery常规选择器源码,适合初学者哦,可以下载下来作为参考资料的。

    Selenium.WebDriver.Extensions:Selenium WebDriver的扩展,包括jQuerySizzle选择器支持

    Selenium WebDriver的扩展包括jQuery / Sizzle选择器支持。 产品特点 主要 支持嵌套选择器 易于设置:安装NuGet软件包并开始与您现有的Selenium解决方案一起使用 通过与Appveyor的持续集成设置,单元和集成测试以及...

    SizzleStats:用于收集 Sizzle 选择器性能统计信息的 jQuery 插件

    用于收集和显示 Sizzle 选择器的控制台性能统计信息的 jQuery 插件。 Sizzle 通过$.find()集成到 jQuery 中,并用于所有接受选择器字符串的方法中,例如.filter(selector) 、 .closest(selector)等。 SizzleStats ...

    jQuery选择器源码解读(一):Sizzle方法

    * Sizzle方法是Sizzle选择器包的主要入口,jQuery的find方法就是调用该方法获取匹配的节点 * 该方法主要完成下列任务: * 1、对于单一选择器,且是ID、Tag、Class三种类型之一,则直接获取并返回结果 * 2、对于...

    sizzle-pseudos:jQuery和Sizzle的很酷的自定义伪选择器的集合

    jQuery / Sizzle自定义伪选择器 只是我的伪装收藏。 表现 请注意将通过这些选择器传递多少个元素,因为它们将无法利用本机DOM querySelectorAll()方法提供的性能提升。 为了在使用这些伪指令中的任何一个时获得最佳...

    jQuery原理系列-css选择器的简单实现

    jQuery最强大的功能在于它可以通过css选择器查找元素,它的源码中有一半是sizzle css选择器引擎的代码,在html5规范出来之后,增加了document.querySelector和document.querySelectorAll直接查找元素,如果是做...

    jQuery 1.8 正式版

    1. Sizzle 选择器引擎重新架构 2. 重新改造动画处理 3. 自动 CSS 前缀处理 当你在 .css() 和 .animate() 中使用 CSS 属性时,jQuery 会自动根据浏览器类型来设置一些前缀,例如 .css("user-select", "none") 在 ...

    最新jquery.1.8.1

    此外,选择器引擎Sizzle修复了一些边缘问题和bug,包括对于多个选择符(~ &gt; +)的改进、更好地检测浏览器bug等。 5. XSS防护 $()方法可以创建HTML元素,如果被用来传递一个[removed]标签,则可以运行脚本。...

    高效jQuery选择器的5个技巧实例分析

    本文实例讲述了高效jQuery选择器的5个技巧。分享给大家供大家参考,具体如下: 顾名思义,jQuery专注于查询(queries)。...在最坏的情况下,jQuery的Sizzle引擎必须解析选择器字符串来匹配元素。 下

    jQuery源码分析-04 选择器-Sizzle-工作原理分析

    在分析Sizzle源码之前,先整理一下选择器的工作原理 先明确一些选择器中用到的名词,后边阅读时不会有歧义: 选择器表达式: “div &gt; p” 块表达式: “div” “p” 并列选择器表达式: “div, p” 块分割器: ...

    犀利开发jQuery内核详解与实践

    资源名称:犀利开发 jQuery内核详解与实践内容简介:本书循序渐进地讲解了jQuery高效开发的方法和技巧,内容包括jQuery框架的设计模式和思路、Sizzle选择器的构成和工作机制、DOM文档操作、事件处理、动画设计、Ajax...

    犀利开发_jQuery内核详解与实践(完整版421页).part3(共3部分)

    本书循序渐进地讲解了jquery高效开发的方法和技巧,内容包括jquery框架的设计模式和思路、sizzle选择器的构成和工作机制、dom文档操作、事件处理、动画设计、ajax异步通信、插件扩展和辅助工具等。  执行效率是...

Global site tag (gtag.js) - Google Analytics