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 相关文章推荐
用js来解决ajax读取页面乱码
Nov 28 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
Aug 12 Javascript
JavaScript笔记之数据属性和存储器属性
Mar 31 Javascript
基于gulp合并压缩Seajs模块的方式说明
Jun 14 Javascript
纯js模仿windows系统日历
Feb 04 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 Javascript
layui动态绑定事件的方法
Sep 20 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.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
jQuery 加上最后自己的验证
2009/11/04 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
python 循环遍历字典元素的简单方法
2016/09/11 Python
10个Python小技巧你值得拥有
2018/09/29 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
初三家长会邀请函
2014/01/18 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
公司租房协议书
2014/10/14 职场文书
感谢信
2019/04/11 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python