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调用asp.net 页面后台的实现代码
Apr 27 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
js实现界面向原生界面发消息并跳转功能
Nov 22 Javascript
JS按钮闪烁功能的实现代码
Jul 21 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 Javascript
微信小程序拼接图片链接无底洞深入探究
Sep 03 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 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中目录,文件操作详谈
2007/03/19 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
jQuery圆形统计图开发实例
2015/01/04 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
详解webpack+express多页站点开发
2017/12/22 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
Python如何脚本过滤文件中的注释
2020/05/27 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
weblogic面试题
2016/03/07 面试题
请解释virtual关键字的含义
2015/06/17 面试题
《老山界》教学反思
2014/04/08 职场文书
运动会演讲稿100字
2014/08/25 职场文书
教师节寄语2015
2015/03/23 职场文书
工会经费申请报告
2015/05/15 职场文书
文明礼仪主题班会
2015/08/13 职场文书
2019各种承诺书范文
2019/06/24 职场文书