jQuery 性能优化指南(2)


Posted in Javascript onMay 21, 2009
4,对直接的DOM操作进行限制
 
这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM 。
这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 。直接的DOM操作速度很慢。

例如,你想动态的创建一组列表元素,千万不要这样做,如下所示:

var top_100_list = [...], // 假设这里是100个独一无二的字符串
$mylist = $("#mylist"); // jQuery 选择到 <ul> 元素
for (var i=0, l=top_100_list.length; i<l; i++){
  $mylist.append("<li>" + top_100_list[i] + "</li>");
}

我们应该将整套元素字符串在插入进dom中之前先全部创建好,如下所示:

var top_100_list = [...],$mylist = $("#mylist"), top_100_li = ""; // 这个变量将用来存储我们的列表元素
for (var i=0, l=top_100_list.length; i<l; i++){
   top_100_li += "<li>" + top_100_list[i] + "</li>";
}
$mylist.html(top_100_li);
注:记得以前还看过一朋友写过这样的代码:

for (i = 0; i < 1000; i++) {

    var $myList = $('#myList');

    $myList.append('This is list item ' + i);

}

呵呵,你应该已经看出问题所在了。既然把#mylist循环获取了1000次!!!
 

5,冒泡
 

除非在特殊情况下, 否则每一个js事件(例如:click, mouseover等.)都会冒泡到父级节点。
当我们需要给多个元素调用同个函数时这点会很有用。

代替这种效率很差的多元素事件监听的方法就是, 你只需向它们的父节点绑定一次。

比如, 我们要为一个拥有很多输入框的表单绑定这样的行为: 当输入框被选中时为它添加一个class

传统的做法是,直接选中input,然后绑定focus等,如下所示:

$("#entryform input").bind("focus", function(){
    $(this).addClass("selected");
}).bind("blur", function(){
    $(this).removeClass("selected");
});

当然上面代码能帮我们完成相应的任务,但如果你要寻求更高效的方法,请使用如下代码:

$("#entryform").bind("focus", function(e){
    var $cell = $(e.target); // e.target 捕捉到触发的目标元素
    $cell.addClass("selected");
}).bind("blur", function(e){
    var $cell = $(e.target);
    $cell.removeClass("selected");
});
通过在父级监听获取焦点和失去焦点的事件,对目标元素进行操作。
在上面代码中,父级元素扮演了一个调度员的角色, 它可以基于目标元素绑定事件。
如果你发现你给很多元素绑定了同一个事件监听, 那么现在的你肯定知道哪里做错了。
 
同理,在Table操作时,我们也可以使用这种方式加以改进代码:
普通的方式:

$('#myTable td').click(function(){
    $(this).css('background', 'red');
});
 改进方式:

$('#myTable').click(function(e) {

     var $clicked = $(e.target);

     $clicked.css('background', 'red');

});

假设有100个td,在使用普通的方式的时候,你绑定了100个事件。
在改进方式中,你只为一个元素绑定了1个事件,
至于是100个事件的效率高,还是1个事件的效率高,相信你也能自行分辨了。
 
 

6,推迟到 $(window).load
 

jQuery对于开发者来说有一个很诱人的东西, 可以把任何东西挂到$(document).ready下。
尽管$(document).rady 确实很有用, 它可以在页面渲染时,其它元素还没下载完成就执行。
如果你发现你的页面一直是载入中的状态,很有可能就是$(document).ready函数引起的。

你可以通过将jQuery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。
它会在所有的html(包括<iframe>)被下载完成后执行。

$(window).load(function(){
    // 页面完全载入后才初始化的jQuery函数.
});

一些特效的功能,例如拖放, 视觉特效和动画, 预载入隐藏图像等等,都是适合这种技术的场合。
 

7,压缩JavaScript
 
压缩和最小化你的JavaScript文件。
 
在线压缩地址: http://dean.edwards.name/packer/
压缩之前,请保证你的代码的规范性,否则可能失败,导致Js错误。
 
 
 
jQuery性能优化指南(2)到此结束,指南(3)正在进行中....
 
相信你也有你的idea,请共享出来吧。 Email : cssrain@gmail.com
 
 
英文原文:http://www.artzstudio.com/2009/04/jquery-performance-rules/
中文翻译:http://rlog.cn/350 & http://cssrain.cn
Javascript 相关文章推荐
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
关于firefox的ElementTraversal 接口 使用说明
Nov 11 Javascript
7个JS基础知识总结
Mar 05 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
jQuery实现边框动态效果的实例代码
Sep 23 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
ionic选择多张图片上传的示例代码
Oct 10 Javascript
Vue2 配置 Axios api 接口调用文件的方法
Nov 13 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
解决node终端下运行js文件不支持ES6语法
Apr 04 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
JavaScript实现串行请求的示例代码
Sep 14 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
jQuery 源代码显示控件 (Ajax加载方式).
May 18 #Javascript
You might like
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
调用js时ie6和ie7,ff的区别
2009/08/19 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
vue实现文件上传功能
2018/08/13 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
jquery插件实现轮播图效果
2020/10/19 jQuery
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python找出完数的方法
2018/11/12 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
介绍一下内联、左联、右联
2013/12/31 面试题
优秀企业获奖感言
2014/02/01 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
建设工地安全标语
2014/06/07 职场文书
2015年新农合工作总结
2015/03/30 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
Python使用Kubernetes API访问集群
2021/05/30 Python