jquery 选择器引擎sizzle浅析


Posted in Javascript onFebruary 06, 2013

I'm sorry!我用jquery的大概有一年了,只知道$(selector),其内部选择器的流程走向完全不清晰!于是看了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。下面是流程
/** 
.sizzle 通过 
chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g 
这个正则进行匹配, 
.把我们传来的参数'.test',匹配成'.test' 放到数组 
.检测浏览器是否支持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 出现了'eq(1)' 这样的字符的时候,就变正常了,从左向右!这是因为要对结果集进行过滤。
思考
$('div img:eq(0)') 与 $('div img').first() 哪个效率高? 个人认为 后一个高一些,因为 第一从左向右效率低下!没有测试过!理论推导!

今天大致看了下流程,具体的代码没怎么细研究!这里面好的思想值得学习和吸收
欢迎拍砖

Javascript 相关文章推荐
一起来写段JS drag拖动代码
Dec 09 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
Mar 10 Javascript
基于jquery封装的一个js分页
Nov 15 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
javascript中为某个元素指定事件的三种方式
Aug 07 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
Aug 28 Javascript
前端性能优化及技巧
May 06 Javascript
webpack打包并将文件加载到指定的位置方法
Feb 22 Javascript
Rollup处理并打包JS文件项目实例代码
May 31 Javascript
js实现随机点名器精简版
Jun 29 Javascript
extjs3 combobox取value和text案例详解
Feb 06 #Javascript
js汉字转拼音实现代码
Feb 06 #Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 #Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 #Javascript
js中top/parent/frame概述及案例应用
Feb 06 #Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 #Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 #Javascript
You might like
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
详解Vue监听数据变化原理
2017/03/08 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
python实现猜数游戏
2020/03/27 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
佳能英国官方网站:Canon UK
2017/08/08 全球购物
理发店策划方案
2014/06/05 职场文书
运动会加油稿100字
2014/09/19 职场文书
科学育儿宣传标语
2014/10/08 职场文书
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python