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 相关文章推荐
Node.js中对通用模块的封装方法
Jun 06 Javascript
用jQuery的AJax实现异步访问、异步加载
Nov 02 Javascript
Bootstrap导航条鼠标悬停下拉菜单
Jan 04 Javascript
AngularJS前端页面操作之用户修改密码功能示例
Mar 27 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 Javascript
React Native 搭建开发环境的方法步骤
Oct 30 Javascript
Angular5中调用第三方js插件的方法
Feb 26 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
webpack 模块热替换原理
Apr 09 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
微信提示 在浏览器打开 效果实现过程解析
Sep 10 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
Apr 24 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设计模式之装饰者模式
2012/02/29 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
js中arguments的用法(实例讲解)
2013/11/30 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
Python3 伪装浏览器的方法示例
2017/11/23 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Python3爬虫学习入门教程
2018/12/11 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
《高尔基和他的儿子》教学反思
2014/04/09 职场文书
伊索寓言教学反思
2014/05/01 职场文书
电台编导求职信
2014/05/06 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
实习报告范文
2019/07/30 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python