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 28 Javascript
Javascript 刷新全集常用代码
Nov 22 Javascript
js 弹出菜单/窗口效果
Oct 30 Javascript
关于图片按比例自适应缩放的js代码
Oct 30 Javascript
js自动生成对象的属性示例代码
Oct 28 Javascript
Jquery动态添加输入框的方法
May 29 Javascript
JQuery中DOM事件合成用法实例分析
Jun 13 Javascript
javascript从作用域链谈闭包
Jul 29 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 Javascript
js实现表格单列按字母排序
Aug 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 URL地址获取函数代码(端口等) 推荐
2010/05/15 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP实现变色验证码实例
2014/01/06 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP类型约束用法示例
2016/09/28 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
js模拟类继承小例子
2010/07/17 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
2013/02/04 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
Javascript Objects详解
2014/09/04 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
Python用GET方法上传文件
2015/03/10 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python requests.post带head和body的实例
2019/01/02 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
幼儿园的门卫岗位职责
2014/04/10 职场文书
《金子》教学反思
2014/04/13 职场文书
促销活动总结
2014/04/28 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
个人委托书如何写
2014/09/25 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript