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 Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
javascript连续赋值问题
Jul 08 Javascript
Angular2 (RC4) 路由与导航详解
Sep 21 Javascript
通过button将form表单的数据提交到action层的实例
Sep 08 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
Oct 15 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
webpack4的迁移的使用方法
May 25 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
Sep 10 Javascript
Three.JS实现三维场景
Dec 30 Javascript
了解javascript中let和var及const关键字的区别
May 24 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
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中使用PDF文档功能
2006/10/09 PHP
php MYSQL 数据备份类
2009/06/19 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
javascript间隔刷新的简单实例
2013/11/14 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
Python编程之微信推送模板消息功能示例
2017/08/21 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python3多线程操作简单示例
2018/05/22 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
如何写好自荐信
2014/04/07 职场文书
应届生求职信范文
2014/06/30 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书