jQuery 性能优化指南 (1)

 更新时间:2023年05月19日 18:35:17   投稿:mdxy-dxy  
在jQuery中最快的选择器是ID选择器,因为它直接来自于JavaScript的getElementById()方法

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

相关文章

  • jquery1.4 教程一 便利的设置函数

    jquery1.4 教程一 便利的设置函数

    jquery1.4已经发布了,1.4相对于1.32的改进还是非常巨大的,可以说是全面性的,性能也全面超越了1.32。这一周,将一一展示jquery1.4的改进,同时也会放出相应的demo。
    2010-02-02
  • Jquery优化效率 提升性能解决方案

    Jquery优化效率 提升性能解决方案

    jQuery是目前非常流行的Javascript库之一,随着jQuery应用程序的逐渐增多,其性能优化问题是程序员们不可忽视的,我们知道在jQuery中最快的选择器是ID选择器,因为它直接来自于JavaScript的getElementById()方法。
    2010-09-09
  • jQuery 监控键盘一段时间没输入

    jQuery 监控键盘一段时间没输入

    当一个文本框中,里面的内容1秒钟无变化,则表示用户1秒钟内无输入,说明用户是已经输入完成,再等待返回数据了。那么jQuery如何实现判断1秒内无输入呢,一起通过本文学习吧
    2016-04-04
  • jQuery 翻牌或百叶窗效果(内容三秒自动切换)

    jQuery 翻牌或百叶窗效果(内容三秒自动切换)

    jQuery 翻牌或百叶窗效果(内容三秒自动切换),让列表内容不再枯燥
    2012-06-06
  • 当jquery ajax遇上401请求的解决方法

    当jquery ajax遇上401请求的解决方法

    下面小编就为大家带来一篇当jquery ajax遇上401请求的解决方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • jquery三大不同版本之间区别专家讲解

    jquery三大不同版本之间区别专家讲解

    jQuery是一个快速、简洁的JavaScript框架,目前jQuery有1.x、2.x、3.x三个版本,在jQuery官网(http://jquery.com/)可以查看,2.x、3.x不是 1.x 的后续或者升级版本,他们是同时更新迭代的,现在使用最广的版本都是1.x的
    2023-09-09
  • jQuery实现Select左右复制移动内容

    jQuery实现Select左右复制移动内容

    这篇文章主要介绍了基于jQuery实现Select左右复制移动内容的实现方法,代码非常简单,具有参考借鉴价值,需要的朋友参考下
    2016-08-08
  • jQuery 如何给Carousel插件添加新的功能

    jQuery 如何给Carousel插件添加新的功能

    本文给大家介绍如何给Carousel插件添加新的功能,非常方便以后的程序开发,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-04-04
  • jQuery 浮动广告实现代码

    jQuery 浮动广告实现代码

    用jquery实现的浮动广告代码,需要的朋友可以参考下。
    2008-12-12
  • jQuery窗口、文档、网页各种高度的精确理解

    jQuery窗口、文档、网页各种高度的精确理解

    这篇文章主要帮助大家快速理解jQuery浏览器窗口、网页文档及可视窗口的各种高度,需要的朋友可以参考下
    2014-07-07

最新评论