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 相关文章推荐
javascript中获取选中对象的类型
Apr 02 Javascript
Javascript 多浏览器兼容总结(实战经验)
Oct 30 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 Javascript
JavaScript中原型和原型链详解
Feb 11 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
May 04 Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 Javascript
JavaScript计划任务后台运行的方法
Dec 18 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
Vuex中mutations与actions的区别详解
Mar 01 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
Node.js 中判断一个文件是否存在
Aug 24 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
基于jquery实现等比缩放图片
2014/12/03 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
vue实现底部菜单功能
2018/07/24 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
Python实现网站注册验证码生成类
2017/06/08 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
python使用tornado实现简单爬虫
2018/07/28 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
小组名称和口号
2014/06/09 职场文书
推广普通话标语
2014/06/27 职场文书
新店开张活动方案
2014/08/24 职场文书
竞选学委演讲稿
2014/09/13 职场文书
工资收入证明
2014/10/07 职场文书
教师评职称工作总结2015
2015/04/20 职场文书