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 相关文章推荐
javascript 事件查询综合 推荐收藏
Mar 10 Javascript
JavaScript实现网页上的浮动广告的简单方法
Jun 14 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
jquery垂直公告滚动实现代码
Dec 08 Javascript
JS弹出可拖拽可关闭的div层完整实例
Feb 13 Javascript
JavaScript获取URL汇总
Jun 08 Javascript
JS随机调用指定函数的方法
Jul 01 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
JavaScript取得gridview中获取checkbox选中的值
Jul 24 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
Sep 14 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
Jun 24 Javascript
vue项目实现分页效果
Mar 24 Vue.js
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
yii框架源码分析之创建controller代码
2011/06/28 PHP
PHP垃圾回收机制引用计数器概念分析
2013/06/24 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
Yii框架安装简明教程
2020/05/15 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Vue 修改网站图标的方法
2020/12/31 Vue.js
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python命令行解析模块详解
2018/02/01 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python3让print输出不换行的方法
2020/08/24 Python
Django Form常用功能及代码示例
2020/10/13 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
中学教师请假制度
2014/02/03 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
三年级作文之趣事作文
2019/11/04 职场文书