jQuery最佳实践

转自:http://keenwon.com/955.html

本文介绍一些使用jQuery的通用标准和最佳实践,这些标准不涵盖Javascript的标准和最佳实践,英文原文地址是 http://lab.abhinayrathore.com/jquery-standards/


加载jQuery

1、尽量使用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、尽可能在页面底部加载jQuery和javascript。

5、如何选择jQuery版本?

  • 如果要兼容IE6/7/8,不要使用2.x版本的
  • 对于新的应用,如果不考虑一些插件的兼容性问题,尽可能的使用最新版
  • 从CDN加载jQuery的时候,使用完整的版本号(例如,使用1.11.0,不用1.11和1)
  • 不要加载多个版本的jQuery

6、如果你使用了Prototype, MooTools, Zepto等,尝试使用jQuery代替$。可以使用$.noConflict()让出$的控制权。


jQuery变量

1、所有被缓存的jQuery对象,变量名以$开头。

2、总是缓存jQuery选择器返回的对象,方便复用:

 
 
  1. var $myDiv = $("#myDiv");
  2. $myDiv.click(function(){...});

3、使用驼峰命名。


选择器

1、尽可能的使用ID选择器。ID选择器使用document.getElementById(),所以更快。

2、当使用类选择器的时候,不要加DOM元素类型:

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

3、使用find查找ID->Child的嵌套查询,.find()方法更快,因为第一次选择没有使用jQuery的选择器引擎:

 
 
  1. // 差, 全部使用jQuery的选择器引擎
  2. var $productIds = $("#products div.id");
  3.  
  4. // 好, #products使用document.getElementById(), 只有div.id需要使用jQuery的选择器引擎
  5. var $productIds = $("#products").find("div.id");

4、越靠右侧越具体:

 
 
  1. // 差
  2. $("div.data .gonzalez");
  3.  
  4. // 最佳
  5. $(".data td.gonzalez");

5、选择器不要太“具体”:

 
 
  1. $(".data table.attendees td.gonzalez");
  2. // 更好,尽可能省去中间部分
  3. $(".data td.gonzalez");

6、给选择器指定上下文(限定范围):

 
 
  1. // 慢,因为它在整个DOM结构中查找
  2. $('.class');
  3.  
  4. // 快,因为它只查找 class-container 下的.
  5. $('.class', '#class-container');

7、避免使用“*”:

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

8、避免隐式使用“*”:

 
 
  1. $('div.someclass :radio'); // 差,还是用了“*”
  2. $('div.someclass input:radio'); // 好

9、不要使用多个ID选择器,或者嵌套使用ID选择器,单独的ID选择器使用document.getElementById(),速度很快:

 
 
  1. $('#outer #inner'); // 差
  2. $('div#inner'); // 差
  3. $('.outer-container #inner'); // 差
  4. $('#inner'); // 好, 调用 document.getElementById()


DOM操作

1、先把元素分离出DOM结构,再进行复杂的操作,之后再附加回DOM中。不明白原因的话,可以了解下.detach()这个方法

 
 
  1. var $myList = $("#list-container > ul").detach();
  2. // 对 $myList 执行大量复杂操作
  3. $myList.appendTo("#list-container");

2、使用字符串连接或者array.join(),少用.append(),点击这里查看性能比较。

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

3、不要对不存在的元素做操作:

 
 
  1. // 差: 在发现该ID不存在之前,已经执行了3个函数
  2. $("#nosuchthing").slideUp();
  3. // 好
  4. var $mySelection = $("#nosuchthing");
  5. if ($mySelection.length) {
  6. $mySelection.slideUp();
  7. }


事件

1、一个页面只使用一个Document ready,便于调试和跟踪。

2、不要使用匿名函数绑定事件,匿名函数不利于调试,复用,测试,debug:

 
 
  1. $("#myLink").on("click", function(){...}); // 差
  2. // 好
  3. function myLinkClickHandler(){...}
  4. $("#myLink").on("click", myLinkClickHandler);

3、Document ready 不要用匿名函数,原因同上:

 
 
  1. $(function(){ ... }); // 差: 你没办法写单元测试和复用
  2. // 好
  3. $(initPage); // or $(document).ready(initPage);
  4. function initPage(){
  5. //...
  6. }

4、Document ready 的处理函数应该写在外部文件,内联的javascript可以在一些初始化设置之后调用 ready 函数,例如:

 
 
  1. <script src="my-document-ready.js"></script>
  2. <script>
  3. // 做一些初始化设置.
  4. $(document).ready(initPage); // or $(initPage); initPage函数在外部文件中
  5. </script>

5、不要把事件直接写在HTML元素上,这样不方便调试:


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

6、尽可能的给事件加上命名空间。这样方便解除绑定,而不影响该DOM元素的其他事件:

 
 
  1. $("#myLink").on("click.mySpecialClick", myEventHandler); // 好
  2. // 之后,很容易的解除绑定
  3. $("#myLink").unbind("click.mySpecialClick");


AJAX

1、使用.ajax(),避免.getJson()或者.get(),它们在内部也是调用.ajax()的。

2、不要在https的站点上请求http,使用依赖协议的URL

3、不要把数据加在url上,使用data属性。

 
 
  1. // 可读性差
  2. $.ajax({
  3. url: "something.php?param1=test1&param2=test2",
  4. ....
  5. });
  6. // 可读性好
  7. $.ajax({
  8. url: "something.php",
  9. data: { param1: test1, param2: test2 }
  10. });

4、指定dataType属性,更容易知道数据类型。

5、对于ajax加载的内容,使用委托绑定事件,这样可以在元素不存在的时候执行绑定。(之后ajax加载进DOM结构中)

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

6、使用Promise

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

7、抽象出ajax模板,方便复用:

 
 
  1. var jqxhr = $.ajax({
  2. url: url,
  3. type: "GET", // default is GET but you can use other verbs based on your needs.
  4. cache: true, // default is true, but false for dataType 'script' and 'jsonp', so set it on need basis.
  5. data: {}, // add your request parameters in the data object.
  6. dataType: "json", // specify the dataType for future reference
  7. jsonp: "callback", // only specify this to match the name of callback parameter your API is expecting for JSONP requests.
  8. statusCode: { // if you want to handle specific error codes, use the status code mapping settings.
  9. 404: handler404,
  10. 500: handler500
  11. }
  12. });
  13. jqxhr.done(successHandler);
  14. jqxhr.fail(failureHandler);


动画效果

1、Adopt a restrained and consistent approach to implementing animation functionality(大意:采取受限制的和统一的方法来实现动画功能。)

2、满足用户体验即可,不要做过多的动画:

  • 尽量使用简单的show/hide,slideUp/slideDown来切换元素
  • 尽量使用jQuery预定义的时间间隔(durations),“slow”,“fast”或者400(中等)


插件

1、选择兼容性好,文档,测试齐全何社区支持好的插件。

2、检查插件在不同版本jQuery下的兼容性。

3、任何参加的可复用的组件,都应该以插件的形式实现。


链式调用

1、使用链式调用代替变量缓存和多次调用选择器:

 
 
  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. // 好, 调用一次
  3. $myLink.attr({
  4. href: "#",
  5. title: "my link",
  6. rel: "external"
  7. });

2、尽量不要把css混在js中:

 
 
  1. $("#mydiv").css({'color':red, 'font-weight':'bold'}); // 差

  
  
  1. .error { color: red; font-weight: bold; } /* 好*/
 
 
  1. $("#mydiv").addClass("error"); // 好

3、不要使用过时的方法,注意新版更新时弃用的方法,不要使用它们。

4、必要的时候使用原生js,这里看查看性能对比 http://jsperf.com/document-getelementbyid-vs-jquery/3

 
 
  1. $("#myId"); // 还是有一点点点点慢...
  2. document.getElementById("myId");

就这么多,技术有限,翻译的不妥的地方,欢迎留言指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值