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参数的小问题
Mar 02 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
js confirm()方法的使用方法实例
Jul 13 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
Apr 22 Javascript
javascript变量声明实例分析
Apr 25 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
Feb 14 Javascript
微信小程序url与token设置详解
Sep 26 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
Vue多种方法实现表头和首列固定的示例代码
Feb 02 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 作用域解析运算符(::)
2010/07/27 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
php两种无限分类方法实例
2015/04/21 PHP
为你总结一些php信息函数
2015/10/21 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python在每个字符后添加空格的实例
2018/05/07 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
Python读取YAML文件过程详解
2019/12/30 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
师德师风自查材料
2014/10/14 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
优秀党员推荐材料
2014/12/18 职场文书
先进工作者申报材料
2014/12/23 职场文书