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 相关文章推荐
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
Nov 03 Javascript
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
编程语言JavaScript简介
Oct 16 Javascript
Jquery 实现table样式的设定
Jan 28 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
JavaScript中Array的实用操作技巧分享
Sep 11 Javascript
vue的事件绑定与方法详解
Aug 16 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
js实现表格单列按字母排序
Aug 12 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
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
Python重新加载模块的实现方法
2018/10/16 Python
使用python进行拆分大文件的方法
2018/12/10 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
利用HTML5绘制点线面组成的3D图形的示例
2015/05/12 HTML / CSS
JSF界面控制层技术
2013/06/17 面试题
党员思想汇报材料
2014/12/19 职场文书
先进党支部申报材料
2014/12/24 职场文书
店长岗位职责
2015/02/11 职场文书
信用卡收入证明范本
2015/06/12 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
MySQL Router的安装部署
2021/04/24 MySQL