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 相关文章推荐
调用js时ie6和ie7,ff的区别
Aug 19 Javascript
javascript快速排序算法详解
Sep 17 Javascript
jquery提示效果实例分析
Nov 25 Javascript
学习JavaScript设计模式(策略模式)
Nov 26 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
Aug 24 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
Dec 12 Javascript
jQuery实现弹窗居中效果类似alert()
Feb 27 Javascript
js简易版购物车功能
Jun 17 Javascript
JavaScript中变量提升与函数提升经典实例分析
Jul 26 Javascript
node.JS事件机制与events事件模块的使用方法详解
Feb 06 Javascript
在js中修改html body的样式
Nov 11 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
2017/04/01 PHP
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
JS常用算法实现代码
2016/11/14 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
推荐11个实用Python库
2015/01/23 Python
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
python对视频画框标记后保存的方法
2018/12/07 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
详解查看Python解释器路径的两种方式
2020/10/15 Python
工厂门卫岗位职责
2013/11/25 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
安全横幅标语
2014/06/09 职场文书
运动会宣传语
2015/07/13 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers