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 相关文章推荐
javascript 触发事件列表 比较不错
Sep 03 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
js变量提升深入理解
Sep 16 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
浅析script标签中的defer与async属性
Nov 30 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
Mar 01 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
Mar 21 Javascript
jQuery设置图片等比例缩小的方法
Apr 29 jQuery
JS利用正则表达式实现简单的密码强弱判断实例
Jun 16 Javascript
Node做中转服务器转发接口
Oct 18 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
微信小程序实现通讯录列表展开收起
Nov 18 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获取windows登录用户名的方法
2014/06/24 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
微信自定义分享php代码分析
2016/11/24 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
javascript AOP 实现ajax回调函数使用比较方便
2010/11/20 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
js数组操作学习总结
2013/11/04 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
js实现简单的秒表
2020/01/16 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python移位运算的实现
2019/07/15 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
化妆品店促销方案
2014/02/24 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
Python实现简单的俄罗斯方块游戏
2021/09/25 Python