jQuery选择器的工作原理和优化分析


Posted in Javascript onJuly 25, 2011

每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init 对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为js的prototype对象可 以实现继承,加上js的对象只是引用不会是拷贝,new jQuery,new jQuery.fn和new jQuery.fn.init的子对象是一样的,只是有没有执行到init的不同,这里就不讲原因了,等下一篇再讲为什么会是这样。
当我们使用选择器的时候$(selector,content),就会执行 init(selectot,content),我们看看inti中是怎样执行的:

if ( typeof selector == "string" ) { 
//正则匹配,看是不是HTML代码或者是#id 
var match = quickExpr.exec( selector ); 
//没有作为待查找的 DOM 元素集、文档或 jQuery 对象。 
//selector是#id的形式 
if ( match && (match[1] || !context) ) { 
// HANDLE: $(html) -> $(array) 
//HTML代码,调用clean补全HTML代码 
if ( match[1] ){ 
selector = jQuery.clean( [ match[1] ], context ); 
} 
// 是: $("#id") 
else { 
//判断id的Dom是不是加载完成 
var elem = document.getElementById( match[3] ); 
if ( elem ){ 
if ( elem.id != match[3] ) 
return jQuery().find( selector ); 
return jQuery( elem );//执行完毕return 
} 
selector = []; 
} 
//非id的形式.在context中或者是全文查找 
} else{ 
return jQuery( context ).find( selector ); 
} 
}

这里就说明只有选择器写成$(‘#id')的时候最快,相当于执行了一次 getElementById,后边的程序就不用再执行了。当然往往我们需要的选择器并不是这么简单,比如我们需要id下的CSS为className, 有这样的写法$(‘#id.className')和$(‘#id').find(‘.className');这两种写法的执行结果都是一样的,比 如<div id=”id”><span class=”className”></span></div>,返回的肯定都是<span class=”className”></span>,但是执行的效率是完全不一样的。
在分析一下上边的代码,如果不是$(‘#id')这样的简单选择器的话,都会执行find函 数,那我们再看看find到底是做用的:
find: function( selector ) { 
//在当前的对象中查找 
var elems = jQuery.map(this, function(elem){ 
return jQuery.find( selector, elem ); 
}); 
//下边的代码可以忽略,只是做一些处理 
//这里应用了js的正则对象的静态方法test 
//indexOf("..")需要了解一下xpath的语法,就是判断selector中包含父节点的写法 
//本意就是过滤数组的重复元素 
return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ? 
jQuery.unique( elems ) : 
elems ); 
}

如果这样写$(‘#id .className'),就会执行到扩展的find(‘#id .className',document),因为当前的this是document的jQuery数组,那我们在看看扩展的find他的实现,代码比较 多,就不列出来,总之就是从第二个参数传递进行的dom第一个子节点开始找,遇见#比对id,遇见.比对ClassName,还有:<+-等处理。 那我们要优化,是不是就要想办法让第二个参数context的范围最小,那样遍历是不是就很少了?
如果我们这样写$(‘#id').find(‘.className'),那程序只这样执行 的,第一次init的时候执行一步getElementById,就return了,接着执行 find(‘.className',divDocument),divDocument就是我们第一次选择的是div标签,如果document下有很 多dom对象的时候,这次只遍历divDocument是不是少了很多次,而且在第一次选择id的速度也要比遍历快的多。
现在大家应该是明白了吧。就是说第一层选择最好是ID,而是简单选择器,目的就是定义范围, 提高速度,这次就说这些,选择写法的优化,其他的优化,下次再说。
Javascript 相关文章推荐
javascript之卸载鼠标事件的代码
May 14 Javascript
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
JavaScript插件化开发教程 (二)
Jan 27 Javascript
动态JavaScript所造成一些你不知道的危害
Sep 25 Javascript
javascript self对象使用详解
Oct 18 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
关于HTML5的data-*自定义属性的总结
May 05 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
Javascript之高级数组API的使用实例
Mar 08 Javascript
Jquery 点击按钮显示和隐藏层的代码
Jul 25 #Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
Jul 22 #Javascript
JavaScript实现页面滚动图片加载(仿lazyload效果)
Jul 22 #Javascript
JS 自定义带默认值的函数
Jul 21 #Javascript
表单切换,用回车键替换Tab健(不支持IE)
Jul 20 #Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 #Javascript
iframe 异步加载技术及性能分析
Jul 19 #Javascript
You might like
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
phpwind放自动注册方法
2006/12/02 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python实现全角半角字符互转的方法
2016/11/28 Python
Python函数式编程
2017/07/20 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
python 阶乘累加和的实例
2019/02/01 Python
Python判断有效的数独算法示例
2019/02/23 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
意大利包包和行李箱销售网站:Bagaglio.it
2021/03/02 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
业务经理岗位职责
2013/11/11 职场文书
销售主管竞聘书
2014/03/31 职场文书
初中新生军训方案
2014/05/13 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
党支部审查意见
2015/06/02 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书