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 相关文章推荐
IE与Firefox下javascript getyear年份的兼容性写法
Dec 20 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
Jul 31 Javascript
JavaScript中的cacheStorage使用详解
Jul 29 Javascript
第一次接触神奇的Bootstrap导航条
Aug 09 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 Javascript
原生js实现倒计时--2018
Feb 21 Javascript
JavaScript基础之流程控制语句的用法
Aug 31 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
vue基础之v-bind属性、class和style用法分析
Mar 11 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
Nov 12 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 Errcode: 28 终极解决方法
2009/07/01 PHP
php修改时间格式的代码
2011/05/29 PHP
使用php计算排列组合的方法
2013/11/13 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
js资料toString 方法
2007/03/13 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python提示No module named images的解决方法
2014/09/29 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python编程中的异常处理教程
2015/08/21 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
YUV转为jpg图像的实现
2019/12/09 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
java字符串格式化输出实例讲解
2021/01/06 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
研究生就业推荐表导师评语
2014/12/31 职场文书
教师个人发展总结
2015/02/11 职场文书
红与黑读书笔记
2015/06/29 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
MySQL Server层四个日志的实现
2022/03/31 MySQL