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 相关文章推荐
基于jquery的时间段实现代码
Aug 02 Javascript
js中的this关键字详解
Sep 25 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
Nov 13 Javascript
js中创建对象的几种方式示例介绍
Jan 26 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
Mar 11 Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
Dec 01 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
AngularJS中的拦截器实例详解
Apr 07 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
Apr 23 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 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
Protoss建筑一览
2020/03/14 星际争霸
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
用console.table()调试javascript
2014/09/04 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
2016/01/17 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
Python之os操作方法(详解)
2017/06/15 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
运动会广播稿60字
2014/01/15 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
防沙治沙典型材料
2014/05/07 职场文书
环保建议书300字
2014/05/14 职场文书
计划生育标语
2014/06/23 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
求职简历自我评价2015
2015/03/10 职场文书
考研英语辞职信
2015/05/13 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python