如何提高jQuery性能
沉沙 2018-05-28 来源 : 阅读 1030 评论 0

摘要:本文总结了一些提升速度的技巧改善你的jQuery和JavaScript代码。更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验。jQuery也是javascript,也就是意味着我们要对jQuery和javascript使用相同的编码规则和风格指南,还有最佳实践。

本文总结了一些提升速度的技巧改善你的jQuery和JavaScript代码。更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验。

首先,我们要记住最重要的一点是:jQuery也是javascript,也就是意味着我们要对jQuery和javascript使用相同的编码规则和风格指南,还有最佳实践。

如果你已经开始使用jQuery了,那么强烈建议遵守下面的建议:

缓存变量

DOM的遍历是非常昂贵的,所以尽量缓存一些可能会被重新用到的变量。

// bad
 
h = $('#element').height();
$('#element').css('height',h-20);
 
// good
 
$element = $('#element');
h = $element.height();
$element.css('height',h-20);

   

避免全局变量

使用jQuery和使用javascript一样,最好确保你的变量在你的函数作用域内。

// bad
 
$element = $('#element');
h = $element.height();
$element.css('height',h-20);
 
// good
 
var $element = $('#element');
var h = $element.height();
$element.css('height',h-20);

   

使用匈牙利命名法

在变量前加上一个$符号,很容易看出来这是一个jQuery变量。

// bad
 
var first = $('#first');
var second = $('#second');
var value = first.val();
 
// better - we use to put $ symbol before jQuery-manipulated objects
 
var $first = $('#first');
var $second = $('#second'),
var value = $first.val();

   

使用 Var 链(单 Var 模式)

 不要使用多个var声明,可以将它们合并为一个var声明,建议将没有指定值的变量放在最后。

var
  $first = $('#first'),
  $second = $('#second'),
  value = $first.val(),
  k = 3,
  cookiestring = 'SOMECOOKIESPLEASE',
  i,
  j,
  myArray = {};

   

最好使用on 绑定事件

最新版本的jQuery已经将click()改变为函数on('click')的简写。在之前的版本中实现的不同,click()简写bind()。在jQuery 1.7中,on()是首选方法用于附加事件处理程序。然而,对于一致性可以简单地使用on()。

// bad
 
$first.click(function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
});
 
$first.hover(function(){
    $first.css('border','1px solid red');
})
 
// better
$first.on('click',function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
})
 
$first.on('hover',function(){
    $first.css('border','1px solid red');
})

   

压缩精简javascript

一般来说,我们要尽可能的合并函数

// bad
 
$first.click(function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
});
 
// better
 
$first.on('click',function(){
    $first.css({
        'border':'1px solid red',
        'color':'blue'
    });
});

   

使用链式操作

根据上面的规则,jQuery很容易将方法链接在一起,我们要利用这一优点。

// bad
 
$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
});
$second.fadeIn('slow');
$second.animate({height:'120px'},500);
 
// better
 
$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);

   

保持代码的可读性

当精简了javascript代码和使用了链式操作,你的代码有时候会变得不可读,尽量使用缩进和换行使代码变得漂亮些。

// bad
 
$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);
 
// better
 
$second.html(value);
$second
    .on('click',function(){ alert('hello everybody');})
    .fadeIn('slow')
    .animate({height:'120px'},500);

   

使用短路求值

短路求值是一个从左到右求值的表达式,用 &&(逻辑与)或 || (逻辑或)操作符。

// bad
 
function initVar($myVar) {
    if(!$myVar) {
        $myVar = $('#selector');
    }
}
 
// better
 
function initVar($myVar) {
    $myVar = $myVar || $('#selector');
}

   

使用快捷的方式

精简代码的方式之一就是利用一些编码捷径。

// bad
 
if(collection.length > 0){..}
 
// better
 
if(collection.length){..}

   

复杂的操作要分离元素

如果对DOM元素做大量操作(连续设置多个属性或css样式),建议首先分离元素然后在添加。

// bad
 
var
    $container = $("#container"),
    $containerLi = $("#container li"),
    $element = null;
 
$element = $containerLi.first();
//... a lot of complicated things
 
// better
 
var
    $container = $("#container"),
    $containerLi = $container.find("li"),
    $element = null;
 
$element = $containerLi.first().detach();
//...a lot of complicated things
 
$container.append($element);

   

了解技巧

你可能对使用jQuery中的方法缺少经验,一定要查看的文档,可能会有一个更好或更快的方法来使用它。

// bad
 
$('#id').data(key,value);
 
// better (faster)
 
$.data('#id',key,value);

   

使用子查询缓存的父元素

像之前提到的一样,DOM的遍历的代价很大,典型做法是缓存父元素并在选择子元素时重用这些缓存元素。

// bad
 
var
    $container = $('#container'),
    $containerLi = $('#container li'),
    $containerLiSpan = $('#container li span');
 
// better (faster)
 
var
    $container = $('#container '),
    $containerLi = $container.find('li'),
    $containerLiSpan= $containerLi.find('span');

   

避免通用选择符

当和其他的选择符一起使用时,通用选择符非常的慢。

// bad
 
$('.container > *');
 
// better
 
$('.container').children();

   

避免使用隐式通用选择符

当你漏下了选择符,通用选择符(*)仍然起作用

// bad
 
$('.someclass :radio');
 
// better
 
$('.someclass input:radio');

   

优化选择符

例如,Id选择符应该是唯一的,所以没有必要添加额外的选择符。

// bad
 
$('div#myid');
$('div#footer a.myLink');
 
// better
$('#myid');
$('#footer .myLink');

   

避免多个ID选择符

再次强调ID 选择符应该是唯一的,不需要添加额外的选择符,更不需要多个后代ID选择符。

// bad
 
$('#outer #inner');
 
// better
 
$('#inner');

   

尽量使用最新版本

新版本通常更好:更轻量级,更高效。显然,你需要考虑你要支持的代码的兼容性。例如,2.0版本不支持ie 6/7/8。

不要使用被弃用的方法

关注每个新版本的废弃方法是非常重要的并尽量避免使用这些方法。

/ bad - live is deprecated
 
$('#stuff').live('click', function() {
  console.log('hooray');
});
 
// better
$('#stuff').on('click', function() {
  console.log('hooray');
}); 

   

利用CDN加载加载jQuery

谷歌的CND能保证选择离用户最近的缓存并迅速响应,地址是//code.jQuery.com/jQuery-latest.min.js


必要时组合jQuery和javascript原生代码

上所述,jQuery就是javascript,这意味着用jQuery能做的事情,同样可以用原生代码来做。原生代码的可读性和可维护性可能不如jQuery,而且代码更长。但也意味着更高效(通常更接近底层代码可读性越差,性能越高,例如:汇编,当然需要更强大的人才可以)。记住没有任何框架能比原生代码更小,更轻,更高效。


最后忠告

最后,本文的目的是提高jQuery的性能和给出一些好的建议。如果你想深入的研究对这个话题你会发现很多乐趣。记住,jQuery并非不可或缺,仅是一种选择。思考为什么要使用它。DOM操作?ajax?模版?css动画?还是选择符引擎?有时候,javascript微型框架或jQuery的需求定制版同样是值得考虑的。

 

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标WEB前端jQuery频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程