jQuery编程的最佳实践

前端开发 2088 Views 1 Comments

好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益。

加载jQuery

1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。

  1. <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>  
  2. <script>window.jQuery || document.write('<script src="js/jquery-1.11.0.min.js" type="text/javascript"><\/script>')</script>  

2.安全起见,最好还是提供一个本地备份以便在无法从远程CDN服务器获取jQuery时网站也能工作,如上面代码所示。详情见此。

3.使用裸协议的URL(也就是说去掉http:或者https:),如上面代码展示的那样。

4.如果可能,尽量将你的JavaScript和jQuery代码放到页面底部。详情移步这里,或者查看一个HTML5页面标准模板。

5.该使用哪个版本?

如果你想兼容IE678请表用2.x的版本
针对极少数不用考虑兼容性的幸运儿,极力推荐使用最新版本的jQuery
当从CDN服务器加载jQuery时,最好把版本写全(比如1.11.0而不是1.11或者直接写个1)
千万莫重复加载

6.如果你同时还使用了其他JS框架诸如Prototype, MooTools, Zepto云云,因为他们也使用了$符号,所以你就表再用美刀符号来进行jQuery 编码了,而请用’jQuery’代替。并且调用$.noConflict()保证不会有冲突出现。

7.要检测浏览器对一些新特性是否支持,请用Modernizr。插播广告:论为毛不检测浏览器

关于变量

1.jQuery类型的变量最好加个$前缀。

2.时常将jQuery选择器返回的内容存进变量以便重用

  1. var $products = $("div.products"); // 慢  
  2. var $products = $(".products"); // 快  

3.使用驼峰命名

关于选择器

1.尽量ID选择器。其背后机理其实是调用原生的document.getElementById(),所以速度较其他选择器快。

2.使用类选择器时表指定元素的类型。不信你看这个性能比较

  1. var $products = $("div.products"); // 慢  
  2. var $products = $(".products"); // 快  

3.ID父亲容器下面再查找子元素请用.find()方法。这样做快的原因是通过id选择元素不会使用Sizzle引擎。详情看这里

4.多级查找中,右边尽量指定得详细点而左边则尽量简单点。了解更多

  1. // 丑陋  
  2. $("div.data .gonzalez");  
  3.   
  4. // 优化后  
  5. $(".data td.gonzalez");  

5.避免冗余。详情或者查看性能比较

  1. $(".data table.attendees td.gonzalez");  
  2.   
  3. // 好的方式:去掉了中间的冗余  
  4. $(".data td.gonzalez");  

6.指定选择的上下文。

  1. // 劣质的代码:因为需要遍历整个DOM来找到.class  
  2. $('.class');  
  3.   
  4. // 高品代码:因为只需在指定容器范围内进行查找  
  5. $('.class', '#class-container');  

7.表使用万能选择器。查看具体阐释

  1. $('div.container > *'); // 差  
  2. $('div.container').children(); // 棒  

8.警惕隐式的万能选择器。省略的情况下其实使用的就是*号通配符。更多信息

  1. $('div.someclass :radio'); // 差  
  2. $('div.someclass input:radio'); // 棒  

9.ID已经表示唯一了,背后使用的是document.getElementById(),所以表跟其他选择器混搭了。

  1. $('#outer #inner'); // 脏  
  2. $('div#inner'); // 乱  
  3. $('.outer-container #inner'); // 差  
  4. $('#inner'); // 干净利落,后台只需调用document.getElementById()  

DOM操作相关

1.操作任何元素前先将其从文档卸载,完了再贴回去。这事儿还能说细点

  1. var $myList = $("#list-container > ul").detach();  
  2. //...一大堆对$myList的处理  
  3. $myList.appendTo("#list-container");  

2.代码里将HTML组织好后再一次性贴到DOM中去。具体来说,性能比较

  1. // 这样不好  
  2. var $myList = $("#list");  
  3. for(var i = 0; i < 10000; i++){  
  4.   $myList.append("<li>"+i+"</li>");  
  5. }  
  6.   
  7. // 这样好  
  8. var $myList = $("#list");  
  9. var list = "";  
  10. for(var i = 0; i < 10000; i++){  
  11.   list += "<li>"+i+"</li>";  
  12. }  
  13. $myList.html(list);  
  14.   
  15. // 但这样更好  
  16. var array = [];  
  17. for(var i = 0; i < 10000; i++){  
  18.   array[i] = "<li>"+i+"</li>";  
  19. }  
  20. $myList.html(array.join(''));  

3.不要处理不存在的元素。详情

  1. // 无良的做法:jQuery后台要跑完三个函数后才会知道这个元素其实根本不存在  
  2. $("#nosuchthing").slideUp();  
  3. // 应该这样  
  4. var $mySelection = $("#nosuchthing");  
  5. if ($mySelection.length) {  
  6.   $mySelection.slideUp();  
  7. }  
  8.   
  9. 事件相关  
  10.   
  11. 1.一个页面只写一个文档ready事件的处理程序。这样代码既清晰好调试,又容易跟踪代码的进程。  
  12.   
  13. 2.表用匿名函数来做事件的回调。匿名函数不易调试维护测试和复用。或许你想较真,看看这里吧  
  14.   
  15. $("#myLink").on("click", function(){...}); // 表这样  
  16.   
  17. // 这样  
  18. function myLinkClickHandler(){...}  
  19. $("#myLink").on("click", myLinkClickHandler);  
  20.   
  21. 3.处理文档ready事件的回调也表用匿名函数,匿名函数不易调试维护测试和复用:(  
  22.   
  23. $(function(){ ... }); // 糟糕的做法:无法利用此函数也无法为其写测试用例  
  24.   
  25. // 好的做法  
  26. $(initPage); // 抑或 $(document).ready(initPage);  
  27. function initPage(){  
  28.   // 这里你可以进行程序的初始化了  
  29. }  

4.进一步,最好也将ready事件的处理程序放到外部文件中引入到页面,而页面中内嵌的代码只需调用即可。

  1. <script src="my-document-ready.js"></script>  
  2. <script>  
  3.     // 初始化一些必要的全局变量  
  4.     $(document).ready(initPage); // 抑或 $(initPage);  
  5. </script>  

5.千万表写内联到HTML的JS代码,这是调试的梦魇!应该总是用jQuery来绑定事件自带程序,这样也方便随时动态地取消绑定。

  1. <a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!--不好 -->  
  2.   
  3. $("#myLink").on("click", myEventHandler); // GOOD  

6.如果可能尽量在绑定事件处理程序时使用一个命名空间,这样可以方便地取消绑定而不会影响其他绑定。

  1. $("#myLink").on("click.mySpecialClick", myEventHandler); // 不错  
  2. // 之后,让我们优雅地解除绑定  
  3. $("#myLink").unbind("click.mySpecialClick");  

异步操作

1.直接用$.ajax()而表去用.getJson() 或 .get(),因为jQuery内部还是将其转为前者

2.表对HTTPS站点使用HTTP去发起请求,最好干脆就表指定(将HTTP或者HTTPS从你的URL中移除)

3.表在链接里面嵌参数,请使用专门的参数设置来传递

  1. // 不易阅读的代码...  
  2. $.ajax({  
  3.   url: "something.php?param1=test1&param2=test2",  
  4.   ....  
  5. });  
  6.   
  7. // 更易阅读...  
  8. $.ajax({  
  9.   url: "something.php",  
  10.   data: { param1: test1, param2: test2 }  
  11. });  

4.尽量指明数据类型以便你自己清楚要处理什么样的数据(见下方会提到的Ajax模板)

5.对于异步动态加载的内容,最好使用代理来绑定事件处理程序。这样的好处是对于之后动态加载的元素事件同样有效。你或许想了解更多

  1. $("#parent-container").on("click""a", delegatedClickHandlerForAjax);  

6.使用Promise模式。

  1. $.ajax({ ... }).then(successHandler, failureHandler);  
  2.   
  3. // 抑或  
  4. var jqxhr = $.ajax({ ... });  
  5. jqxhr.done(successHandler);  
  6. jqxhr.fail(failureHandler);  

7.标准的Ajax模板一分。追寻根源

  1. var jqxhr = $.ajax({  
  2.   url: url,  
  3.   type: "GET"// 默认为GET,你可以根据需要更改  
  4.   cache: true// 默认为true,但对于script,jsonp类型为false,可以自行设置  
  5.   data: {}, // 将请求参数放这里.  
  6.   dataType: "json"// 指定想要的数据类型  
  7.   jsonp: "callback"// 指定回调处理JSONP类型的请求  
  8.   statusCode: { // 如果你想处理各状态的错误的话  
  9.       404: handler404,  
  10.       500: handler500  
  11.   }  
  12. });  
  13. jqxhr.done(successHandler);  
  14. jqxhr.fail(failureHandler);  

动画与特效

1.保持一个始终如一风格统一的动画实现

2.紧遵用户体验,表滥用动画特效
使用简洁的显示隐藏,状态切换,滑入滑出等效果来展示元素
使用预设值来设置动画的速度’fast’,’slow’,或者400(中等速度)

插件相关

1.始终选择一个有良好支持,完善文档,全面测试过并且社区活跃的插件

2.注意所用插件与当前使用的jQuery版本是否兼容

3.一些常用功能应该写成jQuery插件。一分jQuery插件的编写模板

链式句法

1.除了用变量将jQuery选择器返回的结果保存,还可以利用好链式调用。

  1. $("#myDiv").addClass("error").show();  

2.当链式调用多达3次以上或代码因绑定回调略显复杂时,使用换行和适当的缩进来提高代码的可读性。

  1. $("#myLink")  
  2.   .addClass("bold")  
  3.   .on("click", myClickHandler)  
  4.   .on("mouseover", myMouseOverHandler)  
  5.   .show();  

3.对于特别长的调用最好还是用变量保存下中间结果来简化代码。

其他

1.使用对象字面量来传递参数

  1. $myLink.attr("href""#").attr("title""my link").attr("rel""external"); // 糟糕:调用了三次attr  
  2. // 不错,只调用了一次attr  
  3. $myLink.attr({  
  4.   href: "#",  
  5.   title: "my link",  
  6.   rel: "external"  
  7. });  

2.表将CSS与jQuery杂揉

  1. $("#mydiv").css({'color':red, 'font-weight':'bold'}); // 不好  
  2.   
  3. .error {/* 不错 */  
  4.   color: red;  
  5.   font-weight: bold;  
  6. }  
  7.   
  8. $("#mydiv").addClass("error");  

3.时刻关注官方Changelog,表使用摒弃了的方法。点此查看所有废弃的方法

4.适时地使用原生JavaScript。一些与此有关的性能比较

  1. $("#myId"); // 多少还是会逊色于...  
  2. document.getElementById("myId");  

REFERENCE

原文:Coding Standards & Best Practices http://lab.abhinayrathore.com/jquery-standards/

原文的reference

  1. jQuery Performance: http://learn.jquery.com/performance/  
  2. jQuery Learn: http://learn.jquery.com  
  3. jQuery API Docs: http://api.jquery.com/  
  4. jQuery Coding Standards and Best Practice: http://www.jameswiseman.com/blog/2010/04/20/jquery-standards-and-best-practice/  
  5. jQuery Plugin Boilerplate: http://stefangabos.ro/jquery/jquery-plugin-boilerplate-revisited/  

转载请注明:一只羊博客 » jQuery编程的最佳实践

分享到:
(4)

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 很赞!

    coolbear2016-02-17 21:11 回复