1. 程式人生 > >前端開發規範之jQuery編碼規範

前端開發規範之jQuery編碼規範

前端開發whqet,csdn,王海慶,whqet,前端開發專家

翻譯人員:前端開發whqet,意譯為主,不當之處敬請指正。

譯者說:臨近期末,大部分的基礎教學內容已經講解完畢,在進行比較大型的專案訓練之前,如果能讓學生了解甚至遵循一些前端開發的編碼規範將會是一件非常有意義的事情。因此,本部落格準備於近期整理一個編碼規範與最佳實踐的系列文章,包括html、css、javascript、jquery、php等,希望能對大家有所幫助。

------------------------------------------------------------

-----------------------------------------------------------------------------------------

本文給大家呈現的如何書寫更好的jQuery程式碼的相關規範和最佳實踐,不包括javascript方面的規範,有好的意見和建議請大家到我的部落格留言賜教,或者看看jQuery API的速查表(cheat sheet)。

載入jQuery

  1. 在您的頁面中優先使用CDN的方式,CDN方式的優點在這裡,這裡有比較流行的jQueryCDN列表清單(由於國內goolge限制問題,建議使用國內的CDN,例如百度的CDN)。
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/jquery-2.1.1.min.js" type="text/javascript"><\/script>')</script>
利用上面程式碼,預備一個相同版本的本地jQuery庫,以備不時之需。使用如上所示的協議獨立性URL(去掉http:或https:,直接以//開頭,例如‘//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js’)如果可能,儘量保持所有的JS程式碼和jQuery在頁面底部載入,更多資訊或看個示例HTML5 Boilerplate使用哪個版本?如果你要相容ie6、7、8,不要使用jQuery2.x版本
對於新的應用來說,如果不存在相容性問題,強烈建議使用最新版本
從CDN載入jQuery時,指定你需要載入版本的完整版本號(例如,使用1.11.0而不是1.11或者1)
不要載入多個jQuery版本
不要使用jquery-latest.js如果你的頁面同時用到了類似於Prototype、MooTools、Zepto等這些同樣使用$的類庫,要使用jquery替代$,我們可以使用$.noConflict()把$的控制權還給其他庫。
使用Modernizr實現高階的瀏覽器特徵檢測。

jQuery變數

  1. 所有用於儲存、快取jQuery物件的變數應該以$字首命名。
  2. 最好把使用選擇器返回的jQuery物件快取到變數裡,以便重用。
var $myDiv = $("#myDiv");
$myDiv.click(function(){...});
使用駝峰法命名變數。

選擇器

  1. 儘可能的使用效率更高的ID選擇器,因為僅僅使用“document.getElementById()”實現。
  2. 使用類(Class)選擇器時,不要使用元素型別(Element Type),看看績效差異
var $products = $("div.products"); // SLOW
var $products = $(".products"); // FAST
對於ID->child的方式,使用find的方式比巢狀選擇器高效,因為第一個選擇器不用使用Sizzle這個選擇器引擎,更多資訊
// BAD, a nested query for Sizzle selector engine
var $productIds = $("#products div.id");

// GOOD, #products is already selected by document.getElementById() so only div.id needs to go through Sizzle selector engine
var $productIds = $("#products").find("div.id");
選擇器右邊越具體越好,左邊相反更多資訊
// Unoptimized
$("div.data .gonzalez");

// Optimized
$(".data td.gonzalez");
避免過度具體,更多資訊看看績效差異
$(".data table.attendees td.gonzalez");
 
// Better: Drop the middle if possible.
$(".data td.gonzalez");
給你的選擇器一個範圍。
// SLOWER because it has to traverse the whole DOM for .class
$('.class');

// FASTER because now it only looks under class-container.
$('.class', '#class-container');
避免使用全域性選擇器,更多資訊
$('div.container > *'); // BAD
$('div.container').children(); // BETTER
避免隱含的全域性選擇器,更多資訊
$('div.someclass :radio'); // BAD
$('div.someclass input:radio'); // GOOD
不要使用重複、交叉使用ID選擇器,因為單獨的ID選擇將使用更高效的document.getElementById()方式,更多資訊
$('#outer #inner'); // BAD
$('div#inner'); // BAD
$('.outer-container #inner'); // BAD
$('#inner'); // GOOD, only calls document.getElementById()

DOM操作

  1. 處理現存元素之前,先剝離,處理之後再附加,更多資訊
var $myList = $("#list-container > ul").detach();
//...a lot of complicated things on $myList
$myList.appendTo("#list-container");
使用字串連線符或者array.join(),比.append高效,更多資訊,看看績效差異
// 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: This runs three functions before it realizes there's nothing in the selection
$("#nosuchthing").slideUp();
 
// GOOD
var $mySelection = $("#nosuchthing");
if ($mySelection.length) {
    $mySelection.slideUp();
}

事件

  1. 每個頁面只使用一次document的ready事件,這樣便於除錯與行為流跟蹤。
  2. 儘量不要使用匿名函式繫結事件,因為匿名函式不利於除錯、維護、測試、重用,更多資訊
$("#myLink").on("click", function(){...}); // BAD
 
// GOOD
function myLinkClickHandler(){...}
$("#myLink").on("click", myLLinkClickHandler);
對於document ready事件處理函式,儘量不用匿名函式,理由同上。
$(function(){ ... }); // BAD: You can never reuse or write a test for this function.
 
// GOOD
$(initPage); // or $(document).ready(initPage);
function initPage(){
    // Page load event where you can initialize values and call other initializers.
}
document ready事件處理函式可以包含在外部檔案中,然後通過頁內js的方式呼叫。
<script src="my-document-ready.js"></script>
<script>
	// Any global variable set-up that might be needed.
	$(document).ready(initPage); // or $(initPage);
</script>	
不要使用html中的行為語法呼叫事件(html的onclick事件屬性),那簡直是除錯者的噩夢。始終使用jquery來繫結、刪除事件是一件愜意的事情。
<a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!-- BAD -->
 
$("#myLink").on("click", myEventHandler); // GOOD
可能的時候,使用自定義事件,我們可以很方便的解除該事件繫結而不影響其他事件。
$("#myLink").on("click.mySpecialClick", myEventHandler); // GOOD
// Later on, it's easier to unbind just your click event
$("#myLink").unbind("click.mySpecialClick");	
當你給多個物件繫結相同的事件時,可以使用事件委派。事件委派中,當我們給父物件繫結事件後,匹配選擇器的後代都可以繫結該事件,無論該後代原來就有,還是新增元素。
$("#list a").on("click", myClickHandler); // BAD, you are attaching an event to all the links under the list.
$("#list").on("click", "a", myClickHandler); // GOOD, only one event handler is attached to the parent.	

Ajax

  1. 避免使用.getJson()和.get(), 像它的名字昭示的那樣使用$.ajax()。
  2. 不要在https站點上使用http請求,最好使用獨立性URL(不包含http:和https:,直接以//開頭)。
  3. 不要在請求URL上放置引數,使用data物件傳遞引數。
// Less readable...
$.ajax({
    url: "something.php?param1=test1¶m2=test2",
    ....
});
 
// More readable...
$.ajax({
    url: "something.php",
    data: { param1: test1, param2: test2 }
});
最好明確指定資料型別(dataType)以便於明確處理的資料型別(參見下例)。對Ajax載入的內容使用事件委派,事件委派可以很好的解決新增元素的事件繫結問題,更多資訊
$("#parent-container").on("click", "a", delegatedClickHandlerForAjax)
	
使用Promise interface(不知道怎麼翻,請大家賜教),更多案例
$.ajax({ ... }).then(successHandler, failureHandler);
 
// OR
var jqxhr = $.ajax({ ... });
jqxhr.done(successHandler);
jqxhr.fail(failureHandler);	
Ajax樣例,更多資訊
var jqxhr = $.ajax({
    url: url,
    type: "GET", // default is GET but you can use other verbs based on your needs.
    cache: true, // default is true, but false for dataType 'script' and 'jsonp', so set it on need basis.
    data: {}, // add your request parameters in the data object.
    dataType: "json", // specify the dataType for future reference
    jsonp: "callback", // only specify this to match the name of callback parameter your API is expecting for JSONP requests.
    statusCode: { // if you want to handle specific error codes, use the status code mapping settings.
        404: handler404,
        500: handler500
    }
});
jqxhr.done(successHandler);
jqxhr.fail(failureHandler);	

效果和動畫

  1. 採用剋制和一致的方法去實現動畫。
  2. 不要過度使用動畫效果,除非是使用者體驗所需。嘗試使用簡單的show/hide,slideUp/slideDown等方法切換物件,嘗試使用‘fast’,'slow'和‘medium’。

外掛

  1. 優先選用具有良好支援、測試、社群支援的外掛。
  2. 檢查該外掛與您所用jQuery版本的相容性。
  3. 任意可複用元件都應該形成外掛,看看jQuery外掛的樣本程式碼

鏈式操作

  1. 將鏈式操作看成變數快取和多選擇器請求的替代方式
$("#myDiv").addClass("error").show();
	
當鏈式操作超過三個或者因為事件繫結變得複雜時,使用換行和縮排提高鏈式操作的可讀性。
$("#myLink")
    .addClass("bold")
    .on("click", myClickHandler)
    .on("mouseover", myMouseOverHandler)
    .show();
對於長的鏈式操作來說,也可以把中間物件快取成一個變數。

雜項

  1. 使用字面物件傳遞引數。
$myLink.attr("href", "#").attr("title", "my link").attr("rel", "external"); // BAD, 3 calls to attr()
// GOOD, only 1 call to attr()
$myLink.attr({
    href: "#",
    title: "my link",
    rel: "external"
});
不要混寫css與jQuery。
$("#mydiv").css({'color':red, 'font-weight':'bold'}); // BAD
.error { color: red; font-weight: bold; } /* GOOD */
$("#mydiv").addClass("error"); // GOOD
不用使用棄用的方法,瞭解每個新版本的棄用方法,並且避免使用它,非常重要。必要的時候可以混合jQuery和原生js,瞭解表現jQuery和原生js的表現差異
$("#myId"); // is still little slower than...
document.getElementById("myId");	

參考文獻

Enjoy it.

----------------------------------------------------------

前端開發whqet,關注web前端開發,分享相關資源,歡迎點贊,歡迎拍磚。
---------------------------------------------------------------------------------------------------------


相關推薦

前端開發規範jQuery編碼規範

前端開發whqet,csdn,王海慶,whqet,前端開發專家翻譯人員:前端開發whqet,意譯為主,不當之處敬請指正。譯者說:臨近期末,大部分的基礎教學內容已經講解完畢,在進行比較大型的專案訓練之前,如果能讓學生了解甚至遵循一些前端開發的編碼規範將會是一件非常有意義的事情。

Airbnb前端規範javascript編碼規範

傳遞 ++ ack ice 必須 轉換 cat eal 快速 1 引用 1.1 對所有的引用使用 const ,不要使用 var。 (這能確保你無法對引用重新賦值,也不會導致出現 bug 或難以理解) // bad var a = 1; var b = 2; /

智能合約最佳實踐 Solidity 編碼規範

Solidity 區塊鏈 智能合約 每一門語言都有其相應的編碼規範, Solidity 也一樣, 下面官方推薦的規範及我的總結,供大家參考,希望可以幫助大家寫出更好規範的智能合約。 命名規範 避免使用 小寫的l,大寫的I,大寫的O 應該避免在命名中單獨出現,因為很容易產生混淆。 合約、庫、事件、枚

前端規範Jacascript程式碼規範

Javascript程式碼規範 所有的 JavaScript 專案適用同一種規範。   JavaScript 程式碼規範 程式碼規範通常包括以下幾個方面: · 變數和函式的命名規則 · 空格,縮排,註釋的使用規則。 · 其他常用規範……

前端規範CSS程式碼規範

CSS編碼規範 語法 · 用兩個空格來代替製表符(tab) -- 這是唯一能保證在所有環境下獲得一致展現的方法。 · 為選擇器分組時,將單獨的選擇器單獨放在一行。 · 為了程式碼的易讀性,在每個宣告塊的左花括號前新增一個空格。 · 宣告塊的右花括

前端規範HTML程式碼規範

HTML程式碼規範(簡稱HTML5) 使用正確的文件型別 文件型別宣告位於HTML文件的第一行: <!DOCTYPE html> 如果你想跟其他標籤一樣使用小寫,可以使用以下程式碼: <!doctype html> 使用小寫元素名 HTML5 元素名可以使用

【安全開發】Perl安全編碼規範

多年以來,Perl已經成為用於系統管理和WebCGI開發的功能最強的程式語言之一(幾乎可以使用Perl做任何功能的程式)。但其擴充套件應用,即作為Internet上CGI的開發工具,使得它經常成為Web伺服器上的攻擊目標。 另外,大多數CGI指令碼有著比一般使用者更高的許可權,導致它更容易受攻擊。下面列舉了

前端程式碼開發規範。web開發規範。web開發注意事項。前端開發如何寫出更規範的程式碼

一、圖片觀看:二、文字描述:1,web開發基本原則:    1.結構html,樣式css,行為js:三者要分離,儘量確保文件和模板只包含HTML結構,樣式都放到樣式表裡,行為都放到腳本里;     2.縮排:統一縮排方式:整體tab /整體空格;     3.檔案編碼:在HT

智慧合約最佳實踐 Solidity 編碼規範

【匯新雲】為大家定期更新文章,【匯新雲】IT人的產業鏈平臺每一門語言都有其相應的編碼規範, Solidity 也一樣, 下面官方推薦的規範及我的總結,供大家參考,希望可以幫助大家寫出更好規範的智慧合約。命名規範避免使用小寫的l,大寫的I,大寫的O 應該避免在命名中單獨出現,因

golang 原始碼分析URL編碼規範

首先看一下url編碼規範: backspace %08 tab %09 linefeed %0A creturn %0D space

編碼規範 ----JAVA註釋規範

一、前言 好的程式碼規範是一個程式設計師的基本修煉,好的程式碼註釋更能體現一個程式設計師的思維邏輯,雖然程式碼是用來給機器執行的,我們只要能寫出能讓編譯器執行的程式碼就行了,但是如果沒有好的編碼規範,到專案後期,加入開發的人員逐漸增多時,每個人的編碼風格都不

規範】alibaba編碼規範閱讀

服務 rpc 方法 als 如果 基本類 except 基本類型 編碼 一、編程規範 (一)命名規範 1、代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束 2、代碼中的命名嚴禁使用評語與英文混合的方式,更不允許直接使用中文的方式 3、類名使用Upper

前端開發利器靜態服務器

環境 oca 配置 pos 服務 path pytho onf dex 在進行前端頁面開發時,為了調試方便,需要在本地啟動一個靜態文件服務器,而不需要與後端api服務一起部署。 常用靜態文件服務器 01. anywhere 使用簡單,需要nodejs環境。安裝:npm in

前端開發知識前端移動端適配總結

演示 等於 不同 無效 這也 sta 一個 name 物理 meta標簽到底做了什麽事情 做過移動端適配的小夥伴一定有遇到過這行代碼: <meta name="viewport" content="width=device-width, initial-scale=1

前端開發總結gulp

                                          &nb

前端開發IDEwebstorm IDE新增Plugins----新增vue外掛

webstorm IDE新增Plugins----新增vue外掛 webstorm IDE很強大了,擴充套件性很強,語法校驗很強大,不過有時候一些特殊的外掛  還是需要自己新增到IDE的 下面以新增VUE Plugins 為例: File--Setting--Plugins[點

前端開發IDE用WebStorm進行Angularjs 2開發

WebStorm是進行JS和前端開發的不二之選的IDE工具,雖然目前版本已經更新了,但是由於Angular 2的成熟度還沒那麼高,所以用WebStorm進行Angular 2的工程建立,還是沒有其他語言的方便。自己嘗試用WebStorm搭建Angular 2的工程,搭建過程特別是在Windows上磕

前端開發IDEwebstorm簡單介紹

webstorm簡單介紹   欲先善其事,必先利其器,如題。 我們可以理解 IDE 就是集成了很多你想要的功能,或者你不想要的功能。換句話說就是裝了很多外掛的 editor ,所以到目前為止,我還覺得沒必要給它裝什麼外掛。 那麼接下來開始介紹webstrom的特色功能:

web前端開發技術淺談對HTML5 智能表單的理解

提示 goods 表單 加載完成 空格 日期和時間 url 顯示 指向 Html5新增input的form屬性,用於指向特定form表單的id,實現input無需放在form標簽之中,即可通過表單進行提交。 <FORM id=xinzeng> … </FO

前端開發技能CSS3

錨偽類:a:link{}(未被訪問狀態);a:visited{}(已訪問狀態);a:hover{}(滑鼠懸停狀態);a:active{}(滑鼠點中啟用連結那一下);注意a:hover必須在a:link,a:visited之後才是有效的;a:active必須放在a:hover之後才是有效的。 大致有這些::r