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 call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
jquery实现弹出窗口效果的实例代码
Nov 28 Javascript
JS实现静止元素自动移动示例
Apr 14 Javascript
jQuery实现锚点scoll效果实例分析
Mar 10 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
Oct 15 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 Javascript
微信小程序实现点击返回顶层的方法
Jul 12 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
Jul 13 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 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中添加用户
2006/12/06 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
php7性能提升的原因详解
2019/10/13 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
js实现文字截断功能
2016/09/14 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
深入理解python中的atexit模块
2017/03/07 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python通过future处理并发问题
2017/10/17 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
python属于解释型语言么
2020/06/15 Python
Python如何批量生成和调用变量
2020/11/21 Python
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
奉献演讲稿范文
2014/05/21 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
岗位职责范本大全
2015/02/26 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书
干部培训工作总结2015
2015/05/25 职场文书
篮球赛新闻稿
2015/07/17 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电