`
nuysoft
  • 浏览: 516712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
91bd5d30-bd1e-3b00-9210-87db1cca0016
jQuery技术内幕
浏览量:198754
社区版块
存档分类
最新评论

[原创] jQuery源码分析-04 选择器-Sizzle-设计思路

阅读更多

 

作者:nuysoft/高云 QQ:47214707 Email:nuysoft@gmail.com 
声明:本文为原创文章,如需转载,请注明来源并保留原文链接
让我们把工作原理讲的更简单一些,先不讲从右向左也不讲接口,先来分析下如果要执行一段选择器表达式,或者说设计一个简版选择器引擎,直觉上需要做些什么工作: 
以div > p为例来模拟这个过程,找div元素下的p元素: 

1. 首先要能正确的将独立的块表达式从选择器表达式中分割出来,这是必须的,否则没法找div元素或p元素 

2. 然后要能正确的执行块表达式,无论是left>right或right>left,首先要能找到div元素或p元素 
块表达式可能不仅仅是简单的id/name/tag/class,也可能是它们之间的组合,甚至是与伪类的组合 
比如div.red,查找具有指定.red的div,怎么实现这个过程呢? 
可以先找div数组,再在div数组上过滤.red;或者也可以先找*.red数组,再在*.red数组上找div 
不管哪种方式,上边的过程都可以分解为:一个简单查找器和一个对查找结果过滤的过滤器 

3. 单个块表达式搞定了,最后来处理块表达式之间的关系,DOM元素之间关系不外乎四种:父子,祖先,兄长,兄弟 
就是找父亲或找儿子,找祖宗或找后代,找哥哥姐姐或找弟弟妹妹,关系不复杂,都有原生API支持
只要把2~3重复执行就可以完成(我感觉我的神经好粗大),选择器引擎的大致思路就是如此。

把上述过程与Sizzle对应着理解: 
1. 分割器 chunker正则 
2. 块查找 Sizzle.find( expr, context, isXML ) 
   块内过滤 Sizzle.filter( expr, set, inplace, not ) 
3. 块间关系过滤 Expr.relative 
这三个接口正是Sizzle实现的核心API。 
  
当然上边的分析有事后诸葛亮的嫌疑,毕竟我已经看过Sizzle源码了, 但是当我试着用上边的过程来理解Sizzle的工作原理时,顿时豁然开朗,希望有所启发。
3
4
分享到:
评论
1 楼 追梦1819 2017-05-02  
[size=x-small][color=red][/color][/size]

相关推荐

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

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

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

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

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

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

    jquery-source-code-1:jquery源码-jquery source code

    (877,2856)Sizzle复杂选择器的实现 (2880,3042)回调:包含函数:对函数的统一管理 (3043,3183)延迟:延迟对象:对异步的统一管理 (3184,3295)支持:功能检测 (3308,3652)data():数据缓存 (3653,3797)...

    jquery 选择器引擎sizzle浅析

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

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

    近期看了一些网上关于Sizzle的分析文章,就匹配次序往往就说使用了从右到左的逆向匹配法,但是具体如何并没有详细介绍,或者就像我之前的几篇文章一样,就代码一行一行做详细介绍,但缺乏整体概念,这里就jQuery-...

    jQuery中的Sizzle引擎分析

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

    jQuery常规选择器源码

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

    jQuery-1.8.2.js

    基于开源的选择器引擎sizzle(从1.3版开始使用)。 ⒉DOM元素遍历及修改(包含对CSS1-3的支持) ⒊事件处理 ⒋动态特效 ⒌AJAX ⒍通过插件来扩展 ⒎方便的工具 - 例如浏览器版本判断 ⒏渐进增强 ⒐链式调用 ⒑多...

    jquery-3.5.1.js

    jquery最新版本 /*! * jQuery JavaScript Library v3.5.1 * https://jquery.com/ * * Includes Sizzle.js ... * ... * Released under the MIT license * https://jquery.org/license ... * Date: 2020-05-04T22:49Z */

    jQuery:jQuery2.0.3源码分析笔记

    这里加入了很多对于原生JavaScript的理解,忽略了Sizzle选择器(它可以单独抽离出来使用Sizzle.js框架)的源码分析,同时由于13.事件操作源码相对比较复杂,只是粗略的进行了源码的调试和说明,对于Jquery如何监听...

    jQuery技术内幕:深入解析jQuery架构设计与实现原理

    资源名称:jQuery技术内幕:深入解析jQuery架构设计与...接着详细分析了底层支持模块的源码实现,包括:选择器 Sizzle、异步队列 Deferred、数据缓存 Data、资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    jquery-1.4.2.js

    jquery-1.4.2.js /*! * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * * Copyright 2010, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * ...

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

    对jQuery的Sizzle各方法做了深入分析(同时也参考了一些网上资料)后,将结果分享给大家。我将采用连载的方式,对Sizzle使用的一些方法详细解释一下,每篇文章介绍一个方法。 若需要转载,请写明出处,多谢。 /* ...

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

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

Global site tag (gtag.js) - Google Analytics