以下是书写jQuery代码的基本规范和最佳实践,这些不包括原生JS规范与最佳实践。
1、尽量使用CDN加载jQuery。
- <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
- <script>window.jQuery || document.write('<script src="js/jquery-1.11.0.min.js" type="text/javascript"><\/script>')</script>
百度公共CDN库在国内所有地区速度应该是最快的,js库也很多,推荐大家使用。
- <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
又拍云JS库加速服务在国内的访问速度还不错,可惜js库比较少。
- <script src="http://upcdn.b0.upaiyun.com/libs/jquery/jquery-1.8.3.min.js"></script>
新浪JS/CSS库又称新浪SAE公共库,在国内的访问速度还不错,js库也很全,推荐大家使用。
- <script src="http://lib.sinaapp.com/js/jquery/1.8.3/jquery.min.js"></script>
- var $myDiv = $("#myDiv");
- $myDiv.click(function(){....});
- // BAD 在整个DOM树中扫描"products"类名
- var $products = $(".products");
-
- // GOOD 只在DIV元素中扫描"products"类名
- var $products = $("div.products");
- // BAD, Sizzle选择器引擎查找层级
- var $productIds = $("#products div.id");
-
- // GOOD, 只有div.id走Sizzle选择器引擎
- var $productIds = $("#products").find("div.id");
- // 未优化
- $("div.data .gonzalez");
-
- // 优化
- $(".data td.gonzalez");
- $(".data table.attendees td.gonzalez");
-
- // Better: 有必要时要去掉中间不必要的内容
- $(".data td.gonzalez");
- // 要扫描整个DOM树寻找
- $('.class');
-
- // 只在#class-container里扫描
- $('.class', '#class-container');
- $('div.container > *'); // BAD
- $('div.container').children(); // BETTER
- $('div.someclass :radio'); // BAD
- $('div.someclass input:radio'); // GOOD
- $('#outer #inner'); // BAD
- $('div#inner'); // BAD
- $('.outer-container #inner'); // BAD
- $('#inner'); // GOOD
- var $myList = $("#list-container > ul").detach();
- //...针对$myList的许多DOM操作
- $myList.appendTo("#list-container");
- // BAD
- var $myList = $("#list");
- for(var i = 0; i < 10000; i++){
- $myList.append("<li>"+i+"</li>");
- }
-
- // GOOD
- var $myList = $("#list");
- var list = "";
- for(var i = 0; i < 10000; i++){
- list += "<li>"+i+"</li>";
- }
- $myList.html(list);
-
- // EVEN FASTER
- var array = [];
- for(var i = 0; i < 10000; i++){
- array[i] = "<li>"+i+"</li>";
- }
- $myList.html(array.join(''));
- // BAD: 这个函数内部要先执行3个函数,才发现选择器选择到的可能是空内容
- $("#nosuchthing").slideUp();
-
- // GOOD
- var $mySelection = $("#nosuchthing");
- if ($mySelection.length) {
- $mySelection.slideUp();
- }
- $("#myLink").on("click", function(){...}); // BAD
-
- // GOOD
- function myLinkClickHandler(){...}
- $("#myLink").on("click", myLinkClickHandler);
- $(function(){ .. }); // BAD: 不容易复用也不利于测试
-
- // GOOD
- $(initPage); // or $(document).ready(initPage);
- function initPage(){
- // Document ready里可以初始化变量和调用其他初始化函数
- }
- <script src="my-document-ready.js"></script>
- <script>
- // 任何其他需要设置的全局变量
- $(document).ready(initPage); // or $(initPage);
- </script>
- <a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!-- BAD -->
- $("#myLink").on("click", myEventHandler); // GOOD
- $("#myLink").on("click.mySpecialClick", myEventHandler); // GOOD
- // 后面会很容易的解绑这个特定的点击事件
- $("#myLink").unbind("click.mySpecialClick");
- // 不可读
- $.ajax({
- url: "something.php?param1=test1¶m2=test2",
- ....
- });
-
- // 可读
- $.ajax({
- url: "something.php",
- data: { param1: test1, param2: test2 }
- });
- $("#parent-container").on("click", "a", delegatedClickHandlerForAjax);
- $.ajax({ ... }).then(successHandler, failureHandler);
-
- // OR
- var jqxhr = $.ajax({ ... });
- jqxhr.done(successHandler);
- jqxhr.fail(failureHandler);
- var jqxhr = $.ajax({
- url: url,
- type: "GET", // 默认值GET,可根据需要配置
- cache: true, // 默认值true, dataType是'script'或'jsonp'时为false,可根据需要配置
- data: {}, // 请求参数对象
- dataType: "json", // 设置数据类型
- jsonp: "callback",// 只在操作JSONP时设置此项
- statusCode: { // 针对特定错误码的回调处理函数
- 404: handler404,
- 500: handler500
- }
- });
- jqxhr.done(successHandler);
- jqxhr.fail(failureHandler);
1、采用统一的动画实现方式。
2、不要过度使用动画效果,除非追求用户体验。
- $("#myDiv").addClass("error").show();
- $("#myLink")
- .addClass("bold")
- .on("click", myClickHandler)
- .on("mouseover", myMouseOverHandler)
- .show();
- $myLink.attr("href", "#").attr("title", "my link").attr("rel", "external"); // BAD
- // GOOD
- $myList.attr({
- href: "#",
- title: "my link",
- rel: "external"
- });
- $("#mydiv").css({'color':red, 'font-weight':'bold'}); // BAD
-
- .error { color: red; font-weight: bold; } /* GOOD */
- $("#mydiv").addClass("error"); // GOOD
- $("#myId"); // 还是慢了些
- document.getElementById("myId");