jQuery 性能优化指南(3)


Posted in Javascript onMay 21, 2009
8,尽量使用ID代替Class。
 

前面性能优化已经说过,ID选择器的速度是最快的。所以在HTML代码中,能使用ID的尽量使用ID来代替class。
看下面的一个例子:

// 创建一个list
var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
     myListItems += '<li class="listItem' + i + '">This is a list item</li>'; //这里使用的是class
 }
myListItems += '</ul>';
$myList.html(myListItems);
// 选择每一个 li
 for (i = 0; i < 1000; i++) {
    var selectedItem = $('.listItem' + i);
}

在代码最后,选择每个li的过程中,总共用了5066毫秒,超过5秒了。

接着我们做一个对比,用ID代替class:

 

// 创建一个list
var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
    myListItems += '<li id="listItem' + i + '">This is a list item</li>'; //这里使用的是id
}
myListItems += '</ul>';
$myList.html(myListItems);
 // 选择每一个 li
for (i = 0; i < 1000; i++) {
     var selectedItem = $('#listItem' + i);
}

在上段代码中,选择每个li总共只用了61毫秒,相比class的方式,将近快了100倍。
 
 

 

9,给选择器一个上下文
 

jQuery选择器中有一个这样的选择器,它能指定上下文。
jQuery( expression, context );

通过它,能缩小选择器在DOM中搜索的范围,达到节省时间,提高效率。
普通方式:
$('.myDiv')
改进方式:
$('.myDiv' , $("#listItem") )
 
 

10,慎用 .live()方法(应该说尽量不要使用)
 

这是jQuery1.3.1版本之后增加的方法,这个方法的功能就是为 新增的DOM元素 动态绑定事件。
但对于效率来说,这个方法比较占用资源。所以请尽量不要使用它。
例如有这么一段代码:

<script type="text/javascript" >
$(function(){
 $("p").click(function(){
     alert( $(this).text() );
 });
$("button").click(function(){
    $("<p>this is second p</p>").appendTo("body");
});
}) </script>
<body>
<p>this is first p</p> <button>add</button>
</body>

运行后,你会发现 新增 的 p元素,并没用被绑定click事件。

你可以改成.live("click")方式解决此问题,代码如下:

$(function(){
$("p").live("click",function(){ //改成live方式
     alert( $(this).text() );
 });
$("button").click(function(){ $("<p>this is second p</p>").appendTo("body"); });})

但我并不建议大家这么做,我想用另一种方式去解决这个问题,代码如下:

$(function(){
$("p").click(function(){
    alert( $(this).text() );
});
$("button").click(function(){
    $("<p>this is second p</p>").click(function(){  //为新增的元素重新绑定一次
            alert( $(this).text() );
    }).appendTo("body");
});
})

虽然我把绑定事件重新写了一次,代码多了点,但这种方式的效率明显高于live()方式,
特别是在频繁的DOM操作中,这点非常明显。


 

11,子选择器和后代选择器

 

后代选择器经常用到,比如:$("#list  p");
后代选择器获取的是元素内部所有元素。

而有时候实际只要获取 子元素,那么就不应该使用后代选择器。
应该使用子选择器,代码如下:
$("#list > p");

 

 

12,使用data()方法存储临时变量

 

下面是一段非常简单的代码,

$(function(){

    var flag = false;

    $("button").click(function(){

        if(flag){

            $("p").text("true");

            flag=false;

        }else{

            $("p").text("false");

            flag=true;

        }

    });

})

 

改用data()方式后,代码如下:

$(function(){

    $("button").click(function(){

        if( $("p").data("flag") ){

            $("p").text("true");

            $("p").data("flag",false);

        }else{

             $("p").text("false");

             $("p").data("flag",true);

        }

    });

})

 

jQuery性能优化指南(3)到此结束。
 
相信你也有你的idea,请共享出来吧。 Email : cssrain@gmail.com
 
Javascript 相关文章推荐
菜鸟javascript基础资料整理2
Dec 06 Javascript
Javascript base64编码实现代码
Dec 02 Javascript
文本域光标操作的jQuery扩展分享
Mar 10 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
Mar 11 Javascript
原生JS和JQuery动态添加、删除表格行的方法
May 28 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
js实现图片360度旋转
Jan 22 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
微信小程序实现导航栏选项卡效果
Jun 19 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
Mar 06 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
jQuery 性能优化指南(2)
May 21 #Javascript
jQuery 性能优化指南 (1)
May 21 #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
You might like
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python3.6编写的单元测试示例
2019/08/17 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
Java多态性的定义以及类型
2014/09/16 面试题
个人授权委托书范本
2014/04/03 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
升国旗演讲稿
2014/09/05 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python