好像是feedly訂閱裏看到的文章,讀完後以爲很是不錯,譯之備用,多看受益。javascript
1.堅持使用CDN來加載jQuery,這種別人服務器免費幫你託管文件的便宜幹嗎不佔呢。點擊查看使用CDN的好處,點此查看一些主流的jQuery CDN地址。php
<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>
2.安全起見,最好仍是提供一個本地備份以便在沒法從遠程CDN服務器獲取jQuery時網站也能工做,如上面代碼所示。詳情見此。css
3.使用裸協議的URL(也就是說去掉http:或者https:),如上面代碼展現的那樣。html
4.若是可能,儘可能將你的JavaScript和jQuery代碼放到頁面底部。詳情移步這裏,或者查看一個HTML5頁面標準模板。html5
5.該使用哪一個版本?java
6.若是你同時還使用了其餘JS框架諸如Prototype, MooTools, Zepto云云,由於他們也使用了$符號,因此你就表再用美刀符號來進行jQuery 編碼了,而請用'jQuery'代替。而且調用$.noConflict()保證不會有衝突出現。jquery
7.要檢測瀏覽器對一些新特性是否支持,請用Modernizr。插播廣告:論爲毛不檢測瀏覽器git
1.jQuery類型的變量最好加個$前綴。github
2.時常將jQuery選擇器返回的內容存進變量以便重用ajax
var $products = $("div.products"); // 慢 var $products = $(".products"); // 快
3.使用駝峯命名
1.儘可能ID選擇器。其背後機理實際上是調用原生的document.getElementById(),因此速度較其餘選擇器快。
2.使用類選擇器時表指定元素的類型。不信你看這個性能比較
var $products = $("div.products"); // 慢 var $products = $(".products"); // 快
3.ID父親容器下面再查找子元素請用.find()方法。這樣作快的緣由是經過id選擇元素不會使用Sizzle引擎。詳情看這裏
4.多級查找中,右邊儘可能指定得詳細點而左邊則儘可能簡單點。瞭解更多
// 醜陋 $("div.data .gonzalez"); // 優化後 $(".data td.gonzalez");
$(".data table.attendees td.gonzalez"); // 好的方式:去掉了中間的冗餘 $(".data td.gonzalez");
6.指定選擇的上下文。
// 劣質的代碼:由於須要遍歷整個DOM來找到.class $('.class'); // 高品代碼:由於只需在指定容器範圍內進行查找 $('.class', '#class-container');
7.表使用萬能選擇器。查看具體闡釋
$('div.container > *'); // 差 $('div.container').children(); // 棒
8.警戒隱式的萬能選擇器。省略的狀況下其實使用的就是*號通配符。更多信息
$('div.someclass :radio'); // 差 $('div.someclass input:radio'); // 棒
9.ID已經表示惟一了,背後使用的是document.getElementById(),因此表跟其餘選擇器混搭了。
$('#outer #inner'); // 髒 $('div#inner'); // 亂 $('.outer-container #inner'); // 差 $('#inner'); // 乾淨利落,後臺只需調用document.getElementById()
1.操做任何元素前先將其從文檔卸載,完了再貼回去。這事兒還能說細點
var $myList = $("#list-container > ul").detach(); //...一大堆對$myList的處理 $myList.appendTo("#list-container");
2.代碼裏將HTML組織好後再一次性貼到DOM中去。具體來講,性能比較
// 這樣很差 var $myList = $("#list"); for(var i = 0; i < 10000; i++){ $myList.append("<li>"+i+"</li>"); } // 這樣好 var $myList = $("#list"); var list = ""; for(var i = 0; i < 10000; i++){ list += "<li>"+i+"</li>"; } $myList.html(list); // 但這樣更好 var array = []; for(var i = 0; i < 10000; i++){ array[i] = "<li>"+i+"</li>"; } $myList.html(array.join(''));
3.不要處理不存在的元素。詳情
// 無良的作法:jQuery後臺要跑完三個函數後纔會知道這個元素其實根本不存在 $("#nosuchthing").slideUp(); // 應該這樣 var $mySelection = $("#nosuchthing"); if ($mySelection.length) { $mySelection.slideUp(); }
1.一個頁面只寫一個文檔ready事件的處理程序。這樣代碼既清晰好調試,又容易跟蹤代碼的進程。
2.表用匿名函數來作事件的回調。匿名函數不易調試維護測試和複用。或許你想較真,看看這裏吧
$("#myLink").on("click", function(){...}); // 表這樣 // 這樣 function myLinkClickHandler(){...} $("#myLink").on("click", myLinkClickHandler);
3.處理文檔ready事件的回調也表用匿名函數,匿名函數不易調試維護測試和複用:(
$(function(){ ... }); // 糟糕的作法:沒法利用此函數也沒法爲其寫測試用例 // 好的作法 $(initPage); // 抑或 $(document).ready(initPage); function initPage(){ // 這裏你能夠進行程序的初始化了 }
4.進一步,最好也將ready事件的處理程序放到外部文件中引入到頁面,而頁面中內嵌的代碼只需調用便可。
<script src="my-document-ready.js"></script> <script> // 初始化一些必要的全局變量 $(document).ready(initPage); // 抑或 $(initPage); </script>
5.千萬表寫內聯到HTML的JS代碼,這是調試的夢魘!應該老是用jQuery來綁定事件自帶程序,這樣也方便隨時動態地取消綁定。
<a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!--很差 -->
$("#myLink").on("click", myEventHandler); // GOOD
6.若是可能儘可能在綁定事件處理程序時使用一個命名空間,這樣能夠方便地取消綁定而不會影響其餘綁定。
$("#myLink").on("click.mySpecialClick", myEventHandler); // 不錯 // 以後,讓咱們優雅地解除綁定 $("#myLink").unbind("click.mySpecialClick");
1.直接用$.ajax()而表去用.getJson() 或 .get(),由於jQuery內部仍是將其轉爲前者
2.表對HTTPS站點使用HTTP去發起請求,最好乾脆就表指定(將HTTP或者HTTPS從你的URL中移除)
3.表在連接裏面嵌參數,請使用專門的參數設置來傳遞
// 不易閱讀的代碼... $.ajax({ url: "something.php?param1=test1¶m2=test2", .... }); // 更易閱讀... $.ajax({ url: "something.php", data: { param1: test1, param2: test2 } });
4.儘可能指明數據類型以便你本身清楚要處理什麼樣的數據(見下方會提到的Ajax模板)
5.對於異步動態加載的內容,最好使用代理來綁定事件處理程序。這樣的好處是對於以後動態加載的元素事件一樣有效。你或許想瞭解更多
$("#parent-container").on("click", "a", delegatedClickHandlerForAjax);
6.使用Promise模式。更多例子
$.ajax({ ... }).then(successHandler, failureHandler); // 抑或 var jqxhr = $.ajax({ ... }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
7.標準的Ajax模板一分。追尋根源
var jqxhr = $.ajax({ url: url, type: "GET", // 默認爲GET,你能夠根據須要更改 cache: true, // 默認爲true,但對於script,jsonp類型爲false,能夠自行設置 data: {}, // 將請求參數放這裏. dataType: "json", // 指定想要的數據類型 jsonp: "callback", // 指定回調處理JSONP類型的請求 statusCode: { // 若是你想處理各狀態的錯誤的話 404: handler404, 500: handler500 } }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
1.保持一個始終如一風格統一的動畫實現
2.緊遵用戶體驗,表濫用動畫特效
1.始終選擇一個有良好支持,完善文檔,全面測試過而且社區活躍的插件
2.注意所用插件與當前使用的jQuery版本是否兼容
3.一些經常使用功能應該寫成jQuery插件。一分jQuery插件的編寫模板
1.除了用變量將jQuery選擇器返回的結果保存,還能夠利用好鏈式調用。
$("#myDiv").addClass("error").show();
2.當鏈式調用多達3次以上或代碼因綁定回調略顯複雜時,使用換行和適當的縮進來提升代碼的可讀性。
$("#myLink") .addClass("bold") .on("click", myClickHandler) .on("mouseover", myMouseOverHandler) .show();
3.對於特別長的調用最好仍是用變量保存下中間結果來簡化代碼。
1.使用對象字面量來傳遞參數
$myLink.attr("href", "#").attr("title", "my link").attr("rel", "external"); // 糟糕:調用了三次attr // 不錯,只調用了一次attr $myLink.attr({ href: "#", title: "my link", rel: "external" });
2.表將CSS與jQuery雜揉
$("#mydiv").css({'color':red, 'font-weight':'bold'}); // 很差
.error {/* 不錯 */ color: red; font-weight: bold; }
$("#mydiv").addClass("error");
3.時刻關注官方Changelog,表使用摒棄了的方法。點此查看全部廢棄的方法
4.適時地使用原生JavaScript。一些與此有關的性能比較
$("#myId"); // 多少仍是會遜色於... document.getElementById("myId");