摘要:鏈?zhǔn)讲僮魇褂面準(zhǔn)讲僮鞔孀兞烤彺婧投啻尾僮髅慨?dāng)鏈長(zhǎng)超過(guò)個(gè)鏈接或得到,因?yàn)榛顒?dòng)任務(wù)的復(fù)雜,使用適當(dāng)?shù)膿Q行和縮進(jìn)使代碼的可讀性。對(duì)于較長(zhǎng)的鏈?zhǔn)讲僮骺梢园褜?duì)象緩存到一個(gè)變量里。
原文地址:http://lab.abhinayrathore.com/jquery-standards/
第一次翻譯,有不對(duì)不妥的地方請(qǐng)拍磚。
在寫出更好的JQuery代碼的時(shí)候有一些標(biāo)準(zhǔn)和最佳實(shí)踐,這些標(biāo)準(zhǔn)不包括JS的標(biāo)準(zhǔn)或最佳實(shí)踐,如果有任何疑問(wèn),建議或改進(jìn),請(qǐng)?jiān)谖业牟┛土粞浴?br>
最后更新時(shí)間:芝加哥時(shí)間2014。3。17,13:15
加載Jquery
1.使用CDN服務(wù)加載jq到你的頁(yè)面里
")
幾個(gè)比較流行的CDN服務(wù): Google: https://developers.google.com/speed/libraries/devguide Microsoft: http://www.asp.net/ajaxlibrary/cdn.ashx jQuery: http://jquery.com/download/ cdnjs: http://cdnjs.com OSSCdn: http://osscdn.com
2.準(zhǔn)備一個(gè)本地的同版本的的JQ。(CDN服務(wù)失效的時(shí)候檢測(cè)window.jQuery是否存在,不存在則加載本地服務(wù)器上的文件)
3.使用相對(duì)協(xié)議加載(如第一條使用//,而不使用http://或https://)
4.如果有可能,始終保持js和jq文件在頁(yè)面的最后加載
5.選擇什么版本?
如果你的網(wǎng)站需要支持IE6、7、8,請(qǐng)不要選擇2.X版本。
對(duì)于新的應(yīng)用,如果沒(méi)有插件的兼用性問(wèn)題,還是推薦使用最新的版本。
當(dāng)從cdn加載jq,始終指定你要加載的完整的版本數(shù)。
不要使用多個(gè)版本
6.如果使用了其他比如Prototype, MooTools, Zepto etc. 等也使用$的庫(kù),試著不要用$調(diào)用jquery的函數(shù),用 jQuery代替,可以使用$.noConflict()方法把$的控制權(quán)交給其他的庫(kù)。
7.對(duì)于先進(jìn)的瀏覽器特性,使用Modernizr.
**JQuer變量 **
1.使用$前綴緩存JQ的對(duì)象
2.緩存JQ選擇器返回的對(duì)象達(dá)到重用的目的
3.使用駝峰式命名變量
選擇器
1.盡可能的使用ID選擇器,因?yàn)樗峭ㄟ^(guò) document.getElementById()處理的。
2.當(dāng)使用class選擇器的時(shí)候不(需)要使用元素類型
var $products = $("div.products"); // SLOW var $products = $(".products"); // FAST
3.對(duì)于ID->child這種嵌套結(jié)構(gòu),使用find()方法,因?yàn)樗煌ㄟ^(guò)Sizzle選擇器引擎處理。
// 糟糕的,一個(gè)使用Sizzle引擎的嵌套選擇 $productIds = $("#products div.id"); //好的,#products已經(jīng)通過(guò) document.getElementById()選擇,所以只有div.id需要通過(guò)Sizzle引擎選擇一下就可以了 $productIds = $("#products").find("div.id");
4.選擇器右側(cè)的內(nèi)容要盡量詳細(xì),左側(cè)則不需要
// 糟糕的 $("div.data .gonzalez"); //好的 $(".data td.gonzalez");
5.避免過(guò)度的描述
// 糟糕的 $(".data table.attendees td.gonzalez"); // 好的,盡可能的去掉中間的不必要的部分 $(".data td.gonzalez");
6.給選擇器指定上下文
$(".class");//慢的,需要遍歷整個(gè)dom去查找.class $(".class", "#class-container");//快的,因?yàn)樗鼉H在class-container元素下查找
7.不使用全局選擇器(*)
$("div.container > *"); // 糟糕的 $("div.container").children(); // 好的
8.避免隱式的使用*
9.不要嵌套ID,因?yàn)樗ㄟ^(guò)document.getElementById()查找,不需要也不應(yīng)該跟其他的選擇器混在一起。
DOM操作
1.在操作前始終把存在的元素分離出來(lái)并且在操作后恢復(fù)它。
var $myList = $("#list-container > ul").detach(); //很多復(fù)雜的東西在$myList $myList.appendTo("#list-container");
2.使用字符串或者array.join()而不是.append()
性能對(duì)照:http://jsperf.com/jquery-append-vs-string-concat
// 糟糕的 var $myList = $("#list"); for(var i = 0; i < 10000; i++){ $myList.append("
3.不要操作不存在的元素,
// 糟糕的,在這個(gè)操作實(shí)現(xiàn)之前先運(yùn)行了3個(gè)方法 $("#nosuchthing").slideUp(); // GOOD var $mySelection = $("#nosuchthing"); if ($mySelection.length) { $mySelection.slideUp(); }
事件
1.每個(gè)頁(yè)面僅使用一個(gè)Document Ready handler,方便快速的調(diào)試和跟蹤
2.不要使用匿名方法,調(diào)試,維護(hù),測(cè)試或重用很困難。
$("#myLink").on("click", function(){...}); // BAD // GOOD function myLinkClickHandler(){...} $("#myLink").on("click", myLinkClickHandler);
Document ready事件處理器不應(yīng)該作為一個(gè)匿名方法,再說(shuō)一次,匿名方法不利于調(diào)試和跟蹤。
$(function(){ ... }); // BAD: 你永遠(yuǎn)無(wú)法重用或者測(cè)試這個(gè)方法 // GOOD $(initPage); // or $(document).ready(initPage); function initPage(){ // 頁(yè)面初始化和調(diào)用其他函數(shù)的處理器 }
Document ready處理器應(yīng)該從外部文件加載并且內(nèi)聯(lián)的腳本可以用來(lái)初始化處理器和設(shè)置
5.不要在HTML內(nèi)使用行為標(biāo)記(內(nèi)聯(lián)腳本),這些是調(diào)試的噩夢(mèng),始終使用JQuery綁定事件保持一致性,這樣也容易添加或移除事件。
my link $("#myLink").on("click", myEventHandler); // GOOD
6.如果可能,對(duì)于事件使用自定義的命名空間,這樣更容易移除指定的事件
AJAX
1.避免使用.getJson() 或 .get(),而是直接使用$.ajax()方法
2.不要使用http或https請(qǐng)求,寧愿選擇無(wú)模式的URLs,從url中去掉http或https
3.不要在url中加參數(shù),用data對(duì)象傳遞它們。
// Less readable... $.ajax({ url: "something.php?param1=test1¶m2=test2", .... }); // More readable... $.ajax({ url: "something.php", data: { param1: test1, param2: test2 } });
4.指定數(shù)據(jù)格式,它能更快速的知道你正在使用哪種數(shù)據(jù)。(Ajax Template example部分)
5.Ajax加載的內(nèi)容使用委派的事件處理程序,委派事件的優(yōu)點(diǎn)是可以處理后加載到文檔里的事件。
$("#parent-container").on("click", "a", delegatedClickHandlerForAjax);
6.使用promise接口
$.ajax({ ... }).then(successHandler, failureHandler); // OR var jqxhr = $.ajax({ ... }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
7.一個(gè)簡(jiǎn)單完整的ajax模板
var jqxhr = $.ajax({ url: url, type: "GET", // 默認(rèn)是GET,可以換成你需要的方式 cache: true, // 默認(rèn)是true,但是對(duì)于dataType 為"script" 和 "jsonp"類型默認(rèn)是false,所以按需調(diào)整。 data: {}, // 把需要提交的參數(shù)寫在這里 dataType: "json", // 指定數(shù)據(jù)類型 jsonp: "callback", // only specify this to match the name of callback parameter your API is expecting for JSONP requests. statusCode: { // 如果想處理具體的錯(cuò)誤代碼,使用的狀態(tài)代碼映射設(shè)置 404: handler404, 500: handler500 } }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
效果和動(dòng)畫(huà)
1. 采取嚴(yán)謹(jǐn)和一致的方法來(lái)實(shí)現(xiàn)動(dòng)畫(huà)功能。
2. 直到被UX需求驅(qū)動(dòng)否則不要過(guò)度做動(dòng)畫(huà)效果。
嘗試使用簡(jiǎn)單的show/hide, toggle and slideUp/slideDown功能切換元素。
使用預(yù)定的參數(shù)"slow", "fast" 或者400 (中等速度).
插件
1.始終使用有良好支持,文檔,測(cè)試和社區(qū)支持的插件
2.檢查插件與你所使用的jQuery版本是否兼容
3.任何常見(jiàn)的可重用組件應(yīng)該實(shí)現(xiàn)為一個(gè)jQuery插件,點(diǎn)擊這里查看jQuery插件樣板代碼。
鏈?zhǔn)讲僮?/strong>
1.使用鏈?zhǔn)讲僮鞔孀兞烤彺婧投啻尾僮?br>
2.每當(dāng)鏈長(zhǎng)超過(guò)3個(gè)鏈接或得到,因?yàn)榛顒?dòng)任務(wù)的復(fù)雜,使用適當(dāng)?shù)膿Q行和縮進(jìn)使代碼的可讀性。
$("#myLink") .addClass("bold") .on("click", myClickHandler) .on("mouseover", myMouseOverHandler) .show();
3.對(duì)于較長(zhǎng)的鏈?zhǔn)讲僮骺梢园褜?duì)象緩存到一個(gè)變量里。
雜項(xiàng)
1.為參數(shù)使用對(duì)象字面量。
$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" });
2.不要混合使用CSS與jQuery。
$("#mydiv").css({"color":red, "font-weight":"bold"}); // BAD .error { color: red; font-weight: bold; } /* GOOD */ $("#mydiv").addClass("error"); // GOOD
3.不要使用過(guò)時(shí)的方法,始終要注意新版本中一些摒棄的方法并且試著不要使用它們,點(diǎn)擊這里查看過(guò)時(shí)方法的列表
4.必要時(shí)結(jié)合使用jQuery的原生JavaScript。參見(jiàn)下面給出的例子的性能差異:http://jsperf.com/document-getelementbyid-vs-jquery/3
$("#myId"); // 它始終比下邊的慢一點(diǎn) document.getElementById("myId");
資源
jQuery Performance: http://learn.jquery.com/performance/
jQuery Learn: http://learn.jquery.com
jQuery API Docs: http://api.jquery.com/
jQuery Coding Standards and Best Practice: http://www.jameswiseman.com/blog/2010/04/20/jquery-standards-and-best-practice/
jQuery Plugin Boilerplate: http://stefangabos.ro/jquery/jquery-plugin-boilerplate-revisited/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87500.html
摘要:對(duì)比內(nèi)部使用引擎,處理各種選擇器。引擎的選擇順序是從右到左,所以這條語(yǔ)句是先選,然后再一個(gè)個(gè)過(guò)濾出父元素,這導(dǎo)致它比最快的形式大約慢。這條語(yǔ)句與上一條是同樣的情況。 使用最新版本 因?yàn)樾掳姹緯?huì)改進(jìn)性能,還有很多新功能 用對(duì)選擇器 最快的選擇器:id選擇器和元素標(biāo)簽選擇器原因:遇到這些選擇器的時(shí)候,jQuery內(nèi)部會(huì)自動(dòng)調(diào)用瀏覽器的原生方法(比如getElementById()),所以...
摘要:所以,最佳選擇是。事實(shí)上,這種處理完全不必要。這樣的設(shè)計(jì),使得讀取局部變量比讀取全局變量快得多。請(qǐng)看下面兩段代碼,第一段代碼是讀取全局變量第二段代碼是讀取局部變量第二段代碼讀取變量的時(shí)候,不用前往上一層作用域,所以要比第一段代碼快五六倍。 轉(zhuǎn)自:http://www.ruanyifeng.com/blog/2011/08/jquery_best_practices.html ...
摘要:所以,最佳選擇是。事實(shí)上,這種處理完全不必要。這樣的設(shè)計(jì),使得讀取局部變量比讀取全局變量快得多。請(qǐng)看下面兩段代碼,第一段代碼是讀取全局變量第二段代碼是讀取局部變量第二段代碼讀取變量的時(shí)候,不用前往上一層作用域,所以要比第一段代碼快五六倍。 轉(zhuǎn)自:阮一峰 日期: 2011年8月 4日http://www.ruanyifeng.com/blo... 上周,我整理了《jQuery設(shè)計(jì)思想》。...
摘要:由于系統(tǒng)變得越來(lái)越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來(lái)管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對(duì)應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識(shí)。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開(kāi)始學(xué)習(xí)前端開(kāi)發(fā)的時(shí)候。我看到了很多文章及...
摘要:不允許在文件中直接依賴后端接口,組件繼承可以在組件內(nèi)部通過(guò),繼承另一個(gè)組件當(dāng)然實(shí)際開(kāi)發(fā)中,還有一些行為的規(guī)范代碼提交前要有代碼要有測(cè)試報(bào)告測(cè)試了那些點(diǎn)異步請(qǐng)求的處理頁(yè)面布局一定要寫定位大段代碼一定要寫注釋參數(shù)一定要寫注釋 雖然vue可以當(dāng)做jquery用,可是哪還有必要更換成vue?用 jquery不是很好嗎? 下面是實(shí)際 vue開(kāi)發(fā)中,主推的開(kāi)發(fā)實(shí)踐1,組建設(shè)計(jì)2,組件分層3,組件繼...
閱讀 3542·2023-04-25 19:56
閱讀 1660·2021-11-12 10:36
閱讀 1781·2021-11-08 13:19
閱讀 1544·2019-08-30 14:06
閱讀 3031·2019-08-30 11:01
閱讀 1711·2019-08-29 13:23
閱讀 2731·2019-08-29 11:18
閱讀 3422·2019-08-26 13:35