jQuery 性能优化指南 (1)


Posted in Javascript onMay 21, 2009
1,总是从ID选择器开始继承

在jQuery中最快的选择器是ID选择器,因为它直接来自于JavaScript的getElementById()方法。
例如有一段HTML代码:
<div id="content"> 
<form method="post" action="#"> 
<h2>交通信号灯</h2> 
<ul id="traffic_light"> 
<li><input type="radio" class="on" name="light" value="red" /> 红色</li> 
<li><input type="radio" class="off" name="light" value="yellow" /> 黄色</li> 
<li><input type="radio" class="off" name="light" value="green" /> 绿色</li> 
</ul> 
<input class="button" id="traffic_button" type="submit" value="Go" /> 
</form> 
</div>

如果采用下面的选择器,那么效率是低效的。
var traffic_button = $("#content .button");

因为button已经有ID了,我们可以直接使用ID选择器。如下所示:
var traffic_button = $("#traffic_button");

当然 这只是对于单一的元素来讲。如果你需要选择多个元素,这必然会涉及到 DOM遍历和循环,
为了提高性能,建议从最近的ID开始继承。
如下所示:
var traffic_lights = $("#traffic_light input");

2,在class前使用tag(标签名)

在jQuery中第二快的选择器是tag(标签)选择器( 比如:$("head") )。
跟ID选择器累时,因为它来自原生的getElementsByTagName() 方法。

继续看刚才那段HTML代码:

<div id="content"> 
<form method="post" action="#"> 
<h2>交通信号灯</h2> 
<ul id="traffic_light"> 
<li><input type="radio" class="on" name="light" value="red" /> 红色</li> 
<li><input type="radio" class="off" name="light" value="yellow" /> 黄色</li> 
<li><input type="radio" class="off" name="light" value="green" /> 绿色</li> 
</ul> 
<input class="button" id="traffic_button" type="submit" value="Go" /> 
</form> 
</div>

比如需要选择 红绿 单选框,
那么可以使用一个tag name来限制(修饰)class ,如下所示:
var active_light = $("input.on");
当然也可以结合 就近的ID,如下所示:
var active_light = $("#traffic_light input.on");

在使用tag来修饰class的时候,我们需要注意以下几点:
(1) 不要使用tag来修饰ID,如下所示:
var content = $("div#content");
这样一来,选择器会先遍历所有的div元素,然后匹配#content。
(好像jQuery从1.3.1开始改变了选择器核心后,不存在这个问题了。暂时无法考证。)

(2)不要画蛇添足的使用ID来修饰ID,如下所示:
var traffic_light = $("#content #traffic_light");

注:如果使用属性选择器,也请尽量使用tag来修饰,如下所示:
$('p[row="c3221"]').html();而不是这样:$('[row="c3221"]').html();

3,将jQuery对象缓存起来

把jQuery对象缓存起来 就是要告诉我们 要养成将jQuery对象缓存进变量的习惯。
下面是一个jQuery新手写的一段代码:

$("#traffic_light input.on").bind("click", function(){ ... }); 
$("#traffic_light input.on").css("border", "1px dashed yellow"); 
$("#traffic_light input.on").css("background-color", "orange"); 
$("#traffic_light input.on").fadeIn("slow");

但切记不要这么做。

我们应该先将对象缓存进一个变量然后再操作,如下所示:

var $active_light = $("#traffic_light input.on"); 
$active_light.bind("click", function(){ ... }); 
$active_light.css("border", "1px dashed yellow"); 
$active_light.css("background-color", "orange"); 
$active_light.fadeIn("slow");

记住,永远不要让相同的选择器在你的代码里出现多次.

注:(1)为了区分普通的JavaScript对象和jQuery对象,可以在变量首字母前加上 $ 符号。
(2)上面代码可以使用jQuery的链式操作加以改善。如下所示:

var $active_light = $("#traffic_light input.on"); 
$active_light.bind("click", function(){ ... }) 
.css("border", "1px dashed yellow") 
.css("background-color", "orange") 
.fadeIn("slow");

如果你打算在其他函数中使用jQuery对象,那么你必须把它们缓存到全局环境中。
如下代码所示:

// 在全局范围定义一个对象 (例如: window对象) 
window.$my = { 
head : $("head"), 
traffic_light : $("#traffic_light"), 
traffic_button : $("#traffic_button") 
}; 
function do_something(){ 
// 现在你可以引用存储的结果并操作它们 
var script = document.createElement("script"); 
$my.head.append(script); 
// 当你在函数内部操作是, 可以继续将查询存入全局对象中去. 
$my.cool_results = $("#some_ul li"); 
$my.other_results = $("#some_table td"); 
// 将全局函数作为一个普通的jquery对象去使用. 
$my.other_results.css("border-color", "red"); 
$my.traffic_light.css("border-color", "green"); 
} //你也可以在其他函数中 使用它

jQuery性能优化指南(1)到此结束,请查看指南(2)。
 
 
英文原文:http://www.artzstudio.com/2009/04/jquery-performance-rules/
中文翻译:http://rlog.cn/350 & http://cssrain.cn
 
Javascript 相关文章推荐
js jquery数组介绍
Jul 15 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
Nov 28 Javascript
js结合正则实现国内手机号段校验
Jun 19 Javascript
jquery马赛克拼接翻转效果代码分享
Aug 24 Javascript
jQuery Mobile中的button按钮组件基础使用教程
May 23 Javascript
js实现图片淡入淡出切换简易效果
Aug 22 Javascript
HTML的select控件美化
Mar 27 Javascript
ES6新数据结构Map功能与用法示例
Mar 31 Javascript
JS Input里添加小图标的两种方法
Nov 11 Javascript
JS中使用textPath实现线条上的文字
Dec 25 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 Javascript
javascript操作cookie_获取与修改代码
May 21 #Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 #Javascript
Javascript 的addEventListener()及attachEvent()区别分析
May 21 #Javascript
W3C Group的JavaScript1.8 新特性介绍
May 19 #Javascript
JS backgroundImage控制
May 19 #Javascript
jQuery 源代码显示控件 (Ajax加载方式).
May 18 #Javascript
编写兼容IE和FireFox的脚本
May 18 #Javascript
You might like
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
微信接口生成带参数的二维码
2017/07/31 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
php中yii框架实例用法
2020/12/22 PHP
web 页面分页打印的实现
2009/06/22 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
进一步理解Python中的函数编程
2015/04/13 Python
python字典get()方法用法分析
2015/04/17 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
2019/08/22 Python
使用Python pip怎么升级pip
2020/08/11 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
挂职自我鉴定
2014/02/26 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS