jquery 选择器引擎sizzle浅析 - Web前端
作者:98wpeu发布时间:2026-07-17分类:网页前端技术浏览:2
导读:I'msorry!我用JQuery的大概有一年了,只知道$(selector),其内部选择器的流程走向完全不清晰!于是看了jQuery的源码,jquery用的选择器的引擎是siz...
I'm sorry!我用JQuery的大概有一年了,只知道$(selector),其内部选择器的流程走向完全不清晰!于是看了jQuery的源码,jquery用的选择器的引擎是sizzle,是jquery的作者另一开源项目,在GitHub上面有,号称最快的DOM选择器!不到2000行代码。
上面说了不是很精彩的开场白,我么来个 for example: $('.test') 在JQuery的流程是怎么走的呢?
1.首先会做如下的判断
复制代码 代码如下:
/**
*关于 querySelectorAll函数
*返回当前文档中匹配一个特定选择器的所有的元素
*varNodeList = 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 Unicodecharacters 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() 哪个效率高? 个人认为 后一个高一些,因为 第一从左向右效率低下!没有测试过!理论推导!
今天大致看了下流程,具体的代码没怎么细研究!这里面好的思想值得学习和吸收
欢迎拍砖
上面说了不是很精彩的开场白,我么来个 for example: $('.test') 在JQuery的流程是怎么走的呢?
1.首先会做如下的判断
复制代码 代码如下:
/**
*关于 querySelectorAll函数
*返回当前文档中匹配一个特定选择器的所有的元素
*varNodeList = 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 Unicodecharacters 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() 哪个效率高? 个人认为 后一个高一些,因为 第一从左向右效率低下!没有测试过!理论推导!
今天大致看了下流程,具体的代码没怎么细研究!这里面好的思想值得学习和吸收
欢迎拍砖
相关推荐
- jquery select动态加载选择(兼容各种浏览器) - Web前端
- jQuery事件绑定.on()简要概述及应用 - Web前端
- jquery获取div宽度的实现思路与代码 - Web前端
- jquery写个checkbox——类似邮箱全选功能 - Web前端
- Jquery 数据选择插件Pickerbox使用介绍 - Web前端
- web的各种前端打印方法之jquery打印插件PrintArea实现网页打印 - Web前端
- jQuery-serialize()输出序列化form表单值的方法 - Web前端
- innerHTML与jquery里的html()区别介绍 - Web前端
- jQuery(非HTML5)可编辑表格实现代码 - Web前端
- 使用JQuery和CSS模拟超链接的用户单击事件的实现代码 - Web前端
- 网页前端技术排行
-
- 1[Web前端]用javascript实现默认图片替代未显示的图片 - Web前端
- 2分析Iconfont-阿里巴巴矢量常用图标库 - Web前端
- 3【第六章】Foundation之按钮和下拉功能 - Web前端
- 4基于jquery的滚动条滚动固定div(附演示下载) - Web前端
- 5jQuery编写widget的一些技巧分享 - Web前端
- 6jQuery实例教程:制作网页中可折叠的面板 - Web前端
- 7在Mac/PC上远程调试iPhone/iPad上的网页 - Web前端
- 8分享精心挑选的12款优秀jQuery Ajax分页插件和教程 - Web前端
- 9jQuery实现鼠标移到元素上动态提示消息框效果 - Web前端
- 最近发表
-
- WordPress随机显示特色图片插件:Random Post Thumbnails
- KeePass实现Chrome浏览器自动填充密码方法一
- LNMP一键包nginx 301强制跳转到https教程
- KeePass实现Chrome浏览器自动填充密码方法二
- #建站# 免费的VPS管理软件Xshell8/Xftp8中文版下载
- 使用Xshell 8连接VPS教程_电脑登录vps的方法
- WordPress评论界面添加烟花????效果
- 不同浏览器书签同步方案:坚果云+Floccus_详细使用教程
- iOS端KeePassXC客户端APP:Strongbox Password Safe
- 给WordPress评论中的Gravatar头像图片添加ALT属性


