• 沙里软件

  • ShaliSoft.com [手机站]   办公桌收纳抽屉
  • 首页
  • 博文
  • 演示
  • 管理
  • 怎么编写更好的jquery代码

    网络   2014/4/18 9:38:24

    这是一篇关于jQuery的文章,写到这里给初学者一些建议。

    现在已经有很多文章讨论jQuery和JavaScript的性能问题,然而,在这篇文章中我计划总结一些提升速度的技巧和一些我自己的建议来改善你的jQuery和JavaScript代码。更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验。

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

    另外,如果你是一个javascript的初学者,那么我建议你在开始jQuery之前看一下JavaScript best practices for beginners 和 writing high quality JavaScript这两篇文章。

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

    缓存变量

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // bad
     
    h = $('#element').height();
    $('#element').css('height',h-20);
     
    // good
     
    $element = $('#element');
    h = $element.height();
    $element.css('height',h-20);

    避免全局变量

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 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变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 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声明,建议将没有指定值的变量放在最后。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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()。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 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很容易将方法链接在一起,我们要利用这一优点。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 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代码和使用了链式操作,你的代码有时候会变得不可读,尽量使用缩进和换行使代码变得漂亮些。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 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);

    使用短路求值

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // bad
     
    function initVar($myVar) {
        if(!$myVar) {
            $myVar = $('#selector');
        }
    }
     
    // better
     
    function initVar($myVar) {
        $myVar = $myVar || $('#selector');
    }

    使用快捷的方式

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

    1
    2
    3
    4
    5
    6
    7
    // bad
     
    if(collection.length > 0){..}
     
    // better
     
    if(collection.length){..}

    复杂的操作要分离元素

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 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中的方法缺少经验,一定要查看的文档,可能会有一个更好或更快的方法来使用它。

    1
    2
    3
    4
    5
    6
    7
    // bad
     
    $('#id').data(key,value);
     
    // better (faster)
     
    $.data('#id',key,value);

    使用子查询缓存的父元素

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // bad
     
    var
        $container = $('#container'),
        $containerLi = $('#container li'),
        $containerLiSpan = $('#container li span');
     
    // better (faster)
     
    var
        $container = $('#container '),
        $containerLi = $container.find('li'),
        $containerLiSpan= $containerLi.find('span');

    避免通用选择符

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

    1
    2
    3
    4
    5
    6
    7
    // bad
     
    $('.container > *');
     
    // better
     
    $('.container').children();

    避免使用通用选择符

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

    1
    2
    3
    4
    5
    6
    7
    // bad
     
    $('.someclass :radio');
     
    // better
     
    $('.someclass input:radio');

    优化选择符

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

    1
    2
    3
    4
    5
    6
    7
    8
    // bad
     
    $('div#myid');
    $('div#footer a.myLink');
     
    // better
    $('#myid');
    $('#footer .myLink');

    避免多个ID选择符

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

    1
    2
    3
    4
    5
    6
    7
    // bad
     
    $('#outer #inner');
     
    // better
     
    $('#inner');

    尽量使用最新版本

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

    不要使用被弃用的方法

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

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    / bad - live is deprecated
     
    $('#stuff').live('click', function() {
      console.log('hooray');
    });
     
    // better
    $('#stuff').on('click', function() {
      console.log('hooray');
    }); 

    利用CDN加载加载jQuery

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

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

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

    最后忠告

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


    阅读(945) 分享(0)

    上一篇: 触屏版手机网站开发要点
    下一篇: jquery mobile和sencha touch开发框架对比

  • 精彩推荐

    ◆ Windows Server 2003操作系统单网卡搭建VPN服务器
    ◆ PHP中9大缓存技术总结
    ◆ 微信订阅号授权登录,订阅号怎么实现网页授权登录?
    ◆ jQuery对应的原生js写法
    ◆ 国外程序员整理的PHP资源大全
    ◆ ASP语言使用淘宝接口遇中文字符签名失败解决方法
    ◆ 大型网站图片服务器架构的演
    ◆ php+Mysql 高速分页优化,百万至千万级快速分页
    ◆ 从MyISAM转到InnoDB需要注意什么
    ◆ 新型DDoS攻击LFA 网易网络被攻击原因
  • 用心做事 不能唯利是图

    • 吊儿
    • 用QQ联系我17905772
  • 搜索


  • 最新文章

    • 导出Excel 格式 mso-number-format
    • 服务器iis支持tls1.2,windows server 2008 r2 中IIS启用TLS 1.2(安装SSL后用TLS 1.2)
    • MySQL配置优化
    • EditPlus 添加文件比较工具winmerge
    • 滚动悬浮固定JS特效

  • 热门文章

    • php sso单点登录实现代码
    • 中国菜刀(China chopper) 最新黑客工具
    • redis.conf中文版(基于2.4)
    • 搜索引擎名单大全
    • php图片上传类,支持加水印,生成略缩图

  • 最新图库


  • 最新评论


  • 友情链接

  • 沙里软件

  • 最近访客

    Powered by ShaliSoft.com 豫ICP备13008529号

    免责声明:本站部分内容来源于互联网,转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责,也不构成任何其他建议。如果发现侵犯版权,联系QQ17905772进行删除。