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调用activeX获取u盘序列号的代码
Nov 21 Javascript
JS正则验证邮箱的格式详细介绍
Nov 19 Javascript
Node.js抓取中文网页乱码问题和解决方法
Feb 10 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
微信小程序 radio单选框组件详解及实例代码
Jan 10 Javascript
javascript中json基础知识详解
Jan 19 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
详解es6超好用的语法糖Decorator
Aug 01 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
Jan 27 Javascript
vue 判断页面是首次进入还是再次刷新的实例
Nov 05 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 数组教程 定义数组
2009/10/23 PHP
让PHP以ROOT权限执行系统命令的方法
2011/02/10 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
PHP session 会话处理函数
2016/06/06 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
JS数组(Array)处理函数整理
2014/12/07 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
Vue实现剪贴板复制功能
2019/12/31 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
Python 爬虫图片简单实现
2017/06/01 Python
python numpy格式化打印的实例
2018/05/14 Python
python图像处理入门(一)
2019/04/04 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
Python小白垃圾回收机制入门
2020/06/09 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
安全生产中长期规划实施方案
2014/02/21 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
商务英语求职信范文
2015/03/19 职场文书
网络销售员岗位职责
2015/04/11 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
2015年教师节主持词
2015/07/03 职场文书
庆七一活动简报
2015/07/20 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS