jQuery代码优化 选择符篇


Posted in Javascript onNovember 01, 2011

本文就从选择符的角度简单探讨一下优化jQuery代码的问题。

Sizzle的运行机制

jQuery从1.3开始把根据选择符表达式查找元素的代码独立出来,也就是Sizzle引擎。当我们把一个选择符表达式(比如"#id"、".class"、":nth-child(2)")传递给$()函数时,Sizzle在内部会优先利用浏览器原生支持的DOM方法来查找元素,以求得最大的执行速度。以下就是Sizzle会优先选用的几个标准的原生方法(各个方法的用途不再赘述):

getElementById() 
getElementsByTagName() 
getElementsByClassName() 
querySelectorAll()

如果浏览器不支持某个方法,或者传入的选择符表达式不是标准选择符(如":eq()"、":odd"或其他自定义选择符),Sizzle就会使用document.getElementsByTagName('*')来取得文档中的所有元素,然后再遍历并测试每个元素。显然,这是万不得已才会用的方法;可想而知,这个最笨的方法,效率也是最低的。

优化示例
举个例子,假设我们要取得页面表单中的所有的文本框,即:

<input type="text">
可以使用两个选择符:

$('input[type="text"]') 
$('input:text')

第一个选择符是标准的CSS属性选择符,第二个选择符是自定义选择符。根据前面对Sizzle引擎的分析可知,在大多数现代浏览器(支持原生querySelectorAll()方法的浏览器)中,第一个选择符的速度比第二个要快很多。

再举一个例子。假设有下面两个jQuery查询:

$('input').eq(1) 
$('input:eq(1)')

第一个查询先通过标准的CSS元素选择符查找所有input元素,然后再调用jQuery的eq()方法取得匹配结果中的第二个元素(eq()方法的索引参数是从0开始计算的)。第二个查询则使用了自定义的伪类选择符:eq()。通过测试可以看出,第一种方法的速度比第二种方法快得就更多了。

结论
要尽可能使用CSS规范中规定的选择符,除非没有标准选择符,才考虑使用jQuery的自定义选择符。

(注:本文基于《jQuery基础教程(第3版)》相关章节内容编撰而成。)

Javascript 相关文章推荐
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
JavaScript中的比较操作符&gt;、=、
Dec 31 Javascript
JQuery中使文本框获得焦点的方法实例分析
Feb 28 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
require.js 加载 vue组件 r.js 合并压缩的实例
Oct 14 Javascript
javascript的document中的动态添加标签实现方法
Oct 24 Javascript
详解vue-router和vue-cli以及组件之间的传值
Jul 04 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
Jun 07 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
Aug 12 Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 Javascript
jQuery代码优化之基本事件
Nov 01 #Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
Oct 31 #Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 #Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 #Javascript
加载 Javascript 最佳实践
Oct 30 #Javascript
js判断是否为数组的函数: isArray()
Oct 30 #Javascript
JS trim去空格的最佳实践
Oct 30 #Javascript
You might like
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
php 数组的一个悲剧?
2011/05/11 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
使用php计算排列组合的方法
2013/11/13 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
jQuery实现广告条滚动效果
2017/08/22 jQuery
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
webpack打包js的方法
2018/03/12 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python numpy 显示图像阵列的实例
2018/07/02 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
高考自主招生自荐信
2013/10/20 职场文书
魅力教师事迹材料
2014/01/10 职场文书
班级入场式解说词
2014/02/01 职场文书
学校献爱心活动总结
2014/07/08 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
工作会议简报
2015/07/20 职场文书
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技