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 相关文章推荐
IE DOM实现存在的部分问题及解决方法
Jul 25 Javascript
JQuery 引发两次$(document.ready)事件
Jan 15 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
Mar 01 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
Apr 20 Javascript
javascript解析json实例详解
Nov 05 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
May 25 Javascript
使用jQuery判断浏览器滚动条位置的方法
May 30 Javascript
JS实现评价的星星功能
Aug 20 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
了解javascript中变量及函数的提升
May 27 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实现多条件查询实例代码
2010/07/17 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
jquery复选框全选/取消示例
2013/12/30 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
vue中tab选项卡的实现思路
2018/11/25 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
微信小程序页面传多个参数跳转页面的实现方法
2019/05/17 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
HTML的form表单和django的form表单
2019/07/25 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
python开发一款翻译工具
2020/10/10 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
阿迪达斯希腊官方网上商店:adidas希腊
2019/04/06 全球购物
2014银行授权委托书样本
2014/10/04 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
优秀教师个人总结
2015/02/11 职场文书
大学生实习推荐信
2015/03/27 职场文书