jQuery性能优化技巧分析


Posted in Javascript onFebruary 20, 2015

本文较为详细分析了jQuery性能优化技巧。分享给大家供大家参考。具体分析如下:

一、使用最新版本的jQuery类库

jQuery新版本会较上个版本进行Bug修复和一些优化,不过需要注意的是,在更换版本之后,不要忘记测试你的代码,毕竟有时候不是完全向后兼容的。

二、使用合适的选择器

jQuery选择器性能最佳到最差方式如下:

id选择器,如$('#id', context)
标签选择器,如$('p', context)
class选择器,如$('.class', context)
属性选择器,如$('[attribute=value]', context)
伪类选择器,如$(':hidden', context)

补充及注意事项:

尽量给选择器指定上下文context,可以缩小定位元素的范围
避免id重复修饰id,错误代码:var $el = $('#list #item1')
避免标签或class修饰id,错误代码: var $el = $('ul #item1')
如果使用属性选择器,尽量指定所属的标签选择器,这样可以加快访问速度,正确代码:var $el = $('a[title="link"]')

三、缓存对象

下面是性能不好的方式:

$('#home').css(...);
$('#home').bind('click', function() {});
$('#home').addClass(...);

说明:jQuery会在创建每个选择器的过程中,查找DOM,消耗时间与性能。

比较好的方式:

var $homeLink = $('#home', context);
$homeLink.css(...);
$homeLink.bind('click', function() {});
$homelink.addClass(...);

说明:永远不要让相同的选择器在你的代码里出现多次。

四、循环时的DOM操作

使用jQuery可以很方便的添加,删除或者修改DOM节点,但是在一些循环中,例如for(),while()或者$.each()中处理节点时,下面有个实例值得大家注意:

var $list = $('#list');
for(var i = 0; i < 100; i++) {
  $list.append('<li>' + i + '</li>');
}

说明:循环添加li节点100次,这种操作消耗的性能不低,所以更好的方式是将要添加的节点在插入DOM树之前全部创建好,再一次性添加到DOM树中。更好的方式:

var $list = $('#list'),
  fragment = '';
for(var i = 0; i < 100; i++) {
  fragment += '<li>' + i + '</li>';
}
$list.append(fragment);

五、数组方式使用jQuery对象

使用jQuery选择器获取结果是一个jQuery对象。在性能方面,建议使用简单for或者while循环来处理,而不是$.each(),这样能使你的代码更快。

另外注意:检查长度是一个检查jQuery对象是否存在的方式。

var $list = $('#list');
if($list) {  //总是true
  //do something
}
if($list.length) { //拥有元素才返回true
  //do something
}

六、事件代理

每一个JavaScript事件(如click,mouseover)都会冒泡到父级节点。当我们需要给多个元素调用同一个函数时,这点会很有用。

...
<ul id="list">
  <li id="item1"></li>
  <li id="item2"></li>
  <li id="item3"></li>
  ...
</ul>
...

var $item1 = $('#item1'),
  $item2 = $('#item2'),
  $item3 = $('#item3');
  ...

$item1.click(function() {...});
$item2.click(function() {...});
$item3.click(function() {...});
...

说明:这种方式,如果有100个li,要绑定100个事件。显然,不科学,性能损耗很多。

更好的方式是:只需向li的父节点ul绑定一次事件,然后通过event.target获取到点击的当前元素。

var $list = $('#list');
$list.click(function(e) {
  var $currentItem = $(e.target);  //e.target捕捉到当前触发事件的目标元素
  ...
});

七、将你的代码转化成jQuery插件

如果每次都花时间去写类似的jQuery代码,那么可以考虑将这部分类似的代码变成插件,它能够使你的代码有更好的重用性,并且能够有效的帮助你组织代码。

八、使用Javascript数组join()来拼接字符串

处理长字符串的时候,使用join()方法有助于优化性能。

var arr = [];
for(var i = 0; i < 100; i++){
  arr[i] = '<li>' + i + '</li>';
}
$list.html(arr.join(''));

九、合理利用HTML5的data属性

HTML5的data属性可以帮助我们插入数据,特别是前后端的数据交换。jQuery的data()方法,有效的利用HTML5的属性,来自动得到数据。

...
<a id="info" data-info-index="23" data-role="linkInfo"></a>
...

var $infoLink = $('#info');
var infoIndex = $infoLink.data('info-index');
var type = $infoLink.data('linkInfo');

十、尽量使用原生的JavaScript方法

如:

$(this).css('color': 'blue');

优化成:

this.style.color = 'blue';

如:

$('<p></p>');

优化成:

$(document.createElement('p'));

十一、压缩JavaScript

使用压缩工具压缩JavaScript文件。
发布项目时,应使用“压缩版”JavaScript文件。

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
利用onresize使得div可以随着屏幕大小而自适应的代码
Jan 15 Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 Javascript
JavaScript编程的10个实用小技巧
Apr 18 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
Node.js+Express配置入门教程详解
May 19 Javascript
URL中“#” “?” &amp;“”号的作用浅析
Feb 04 Javascript
浅析javaScript中的浅拷贝和深拷贝
Feb 15 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 Javascript
微信小程序云开发详细教程
May 16 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
解决vue字符串换行问题(绝对管用)
Aug 06 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 #Javascript
jQuery源码解读之addClass()方法分析
Feb 20 #Javascript
jQuery源码解读之hasClass()方法分析
Feb 20 #Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 #Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 #Javascript
js实现感应鼠标图片透明度变化的方法
Feb 20 #Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 #Javascript
You might like
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
php微信开发之关注事件
2018/06/14 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
项目实践之javascript技巧
2007/12/06 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
2021/01/29 jQuery
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
你应该知道的python列表去重方法
2017/01/17 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
2017/11/02 Python
Python实现自动发送邮件功能
2021/03/02 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python输出带颜色字体实例方法
2019/09/01 Python
python 瀑布线指标编写实例
2020/06/03 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
建材投资建议书
2014/05/16 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
监考失职检讨书
2015/01/26 职场文书
2015年保管员工作总结
2015/04/30 职场文书
创业计划书之甜品店
2019/09/18 职场文书
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript