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焦点图切换,上下翻转
May 12 Javascript
深入理解JavaScript系列(13) This? Yes,this!
Jan 18 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
Apr 08 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
深入浅析AngularJS中的module(模块)
Jan 04 Javascript
jquery实现文本框textarea自适应高度
Mar 09 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
Aug 11 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 Javascript
详解JavaScript中的函数、对象
Apr 01 Javascript
vue缓存的keepalive页面刷新数据的方法
Apr 23 Javascript
javaScript实现一个队列的方法
Jul 14 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
一个php作的文本留言本的例子(六)
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
yii实现model添加默认值的方法(2种方法)
2016/01/06 PHP
jQuery 前的按键判断代码
2010/03/19 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
JsRender for object语法简介
2014/10/31 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
vue 页面加载进度条组件实例
2018/02/05 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
JS array数组检测方式解析
2020/05/19 Javascript
python optparse模块使用实例
2015/04/09 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
python实现闹钟定时播放音乐功能
2018/01/25 Python
python游戏地图最短路径求解
2019/01/16 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Python如何对XML 解析
2020/06/28 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
环境科学专业个人求职信
2013/09/26 职场文书
继电保护工岗位职责
2014/01/05 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
趣味运动会开幕词
2015/01/28 职场文书
人事任命通知书
2015/04/21 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
php实例化对象的实例方法
2021/11/17 PHP