摘要:鏈式操作使用鏈式操作代替變量緩存和多次操作每當鏈長超過個鏈接或得到,因為活動任務的復雜,使用適當?shù)膿Q行和縮進使代碼的可讀性。對于較長的鏈式操作可以把對象緩存到一個變量里。
原文地址:http://lab.abhinayrathore.com/jquery-standards/
第一次翻譯,有不對不妥的地方請拍磚。
在寫出更好的JQuery代碼的時候有一些標準和最佳實踐,這些標準不包括JS的標準或最佳實踐,如果有任何疑問,建議或改進,請在我的博客留言。
最后更新時間:芝加哥時間2014。3。17,13:15
加載Jquery
1.使用CDN服務加載jq到你的頁面里
")
幾個比較流行的CDN服務: 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.準備一個本地的同版本的的JQ。(CDN服務失效的時候檢測window.jQuery是否存在,不存在則加載本地服務器上的文件)
3.使用相對協(xié)議加載(如第一條使用//,而不使用http://或https://)
4.如果有可能,始終保持js和jq文件在頁面的最后加載
5.選擇什么版本?
如果你的網(wǎng)站需要支持IE6、7、8,請不要選擇2.X版本。
對于新的應用,如果沒有插件的兼用性問題,還是推薦使用最新的版本。
當從cdn加載jq,始終指定你要加載的完整的版本數(shù)。
不要使用多個版本
6.如果使用了其他比如Prototype, MooTools, Zepto etc. 等也使用$的庫,試著不要用$調(diào)用jquery的函數(shù),用 jQuery代替,可以使用$.noConflict()方法把$的控制權交給其他的庫。
7.對于先進的瀏覽器特性,使用Modernizr.
**JQuer變量 **
1.使用$前綴緩存JQ的對象
2.緩存JQ選擇器返回的對象達到重用的目的
3.使用駝峰式命名變量
選擇器
1.盡可能的使用ID選擇器,因為它是通過 document.getElementById()處理的。
2.當使用class選擇器的時候不(需)要使用元素類型
var $products = $("div.products"); // SLOW var $products = $(".products"); // FAST
3.對于ID->child這種嵌套結(jié)構(gòu),使用find()方法,因為它不通過Sizzle選擇器引擎處理。
// 糟糕的,一個使用Sizzle引擎的嵌套選擇 $productIds = $("#products div.id"); //好的,#products已經(jīng)通過 document.getElementById()選擇,所以只有div.id需要通過Sizzle引擎選擇一下就可以了 $productIds = $("#products").find("div.id");
4.選擇器右側(cè)的內(nèi)容要盡量詳細,左側(cè)則不需要
// 糟糕的 $("div.data .gonzalez"); //好的 $(".data td.gonzalez");
5.避免過度的描述
// 糟糕的 $(".data table.attendees td.gonzalez"); // 好的,盡可能的去掉中間的不必要的部分 $(".data td.gonzalez");
6.給選擇器指定上下文
$(".class");//慢的,需要遍歷整個dom去查找.class $(".class", "#class-container");//快的,因為它僅在class-container元素下查找
7.不使用全局選擇器(*)
$("div.container > *"); // 糟糕的 $("div.container").children(); // 好的
8.避免隱式的使用*
9.不要嵌套ID,因為它通過document.getElementById()查找,不需要也不應該跟其他的選擇器混在一起。
DOM操作
1.在操作前始終把存在的元素分離出來并且在操作后恢復它。
var $myList = $("#list-container > ul").detach(); //很多復雜的東西在$myList $myList.appendTo("#list-container");
2.使用字符串或者array.join()而不是.append()
性能對照:http://jsperf.com/jquery-append-vs-string-concat
// 糟糕的 var $myList = $("#list"); for(var i = 0; i < 10000; i++){ $myList.append("
3.不要操作不存在的元素,
// 糟糕的,在這個操作實現(xiàn)之前先運行了3個方法 $("#nosuchthing").slideUp(); // GOOD var $mySelection = $("#nosuchthing"); if ($mySelection.length) { $mySelection.slideUp(); }
事件
1.每個頁面僅使用一個Document Ready handler,方便快速的調(diào)試和跟蹤
2.不要使用匿名方法,調(diào)試,維護,測試或重用很困難。
$("#myLink").on("click", function(){...}); // BAD // GOOD function myLinkClickHandler(){...} $("#myLink").on("click", myLinkClickHandler);
Document ready事件處理器不應該作為一個匿名方法,再說一次,匿名方法不利于調(diào)試和跟蹤。
$(function(){ ... }); // BAD: 你永遠無法重用或者測試這個方法 // GOOD $(initPage); // or $(document).ready(initPage); function initPage(){ // 頁面初始化和調(diào)用其他函數(shù)的處理器 }
Document ready處理器應該從外部文件加載并且內(nèi)聯(lián)的腳本可以用來初始化處理器和設置
5.不要在HTML內(nèi)使用行為標記(內(nèi)聯(lián)腳本),這些是調(diào)試的噩夢,始終使用JQuery綁定事件保持一致性,這樣也容易添加或移除事件。
my link $("#myLink").on("click", myEventHandler); // GOOD
6.如果可能,對于事件使用自定義的命名空間,這樣更容易移除指定的事件
AJAX
1.避免使用.getJson() 或 .get(),而是直接使用$.ajax()方法
2.不要使用http或https請求,寧愿選擇無模式的URLs,從url中去掉http或https
3.不要在url中加參數(shù),用data對象傳遞它們。
// 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)點是可以處理后加載到文檔里的事件。
$("#parent-container").on("click", "a", delegatedClickHandlerForAjax);
6.使用promise接口
$.ajax({ ... }).then(successHandler, failureHandler); // OR var jqxhr = $.ajax({ ... }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
7.一個簡單完整的ajax模板
var jqxhr = $.ajax({ url: url, type: "GET", // 默認是GET,可以換成你需要的方式 cache: true, // 默認是true,但是對于dataType 為"script" 和 "jsonp"類型默認是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: { // 如果想處理具體的錯誤代碼,使用的狀態(tài)代碼映射設置 404: handler404, 500: handler500 } }); jqxhr.done(successHandler); jqxhr.fail(failureHandler);
效果和動畫
1. 采取嚴謹和一致的方法來實現(xiàn)動畫功能。
2. 直到被UX需求驅(qū)動否則不要過度做動畫效果。
嘗試使用簡單的show/hide, toggle and slideUp/slideDown功能切換元素。
使用預定的參數(shù)"slow", "fast" 或者400 (中等速度).
插件
1.始終使用有良好支持,文檔,測試和社區(qū)支持的插件
2.檢查插件與你所使用的jQuery版本是否兼容
3.任何常見的可重用組件應該實現(xiàn)為一個jQuery插件,點擊這里查看jQuery插件樣板代碼。
鏈式操作
1.使用鏈式操作代替變量緩存和多次操作
2.每當鏈長超過3個鏈接或得到,因為活動任務的復雜,使用適當?shù)膿Q行和縮進使代碼的可讀性。
$("#myLink") .addClass("bold") .on("click", myClickHandler) .on("mouseover", myMouseOverHandler) .show();
3.對于較長的鏈式操作可以把對象緩存到一個變量里。
雜項
1.為參數(shù)使用對象字面量。
$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.不要使用過時的方法,始終要注意新版本中一些摒棄的方法并且試著不要使用它們,點擊這里查看過時方法的列表
4.必要時結(jié)合使用jQuery的原生JavaScript。參見下面給出的例子的性能差異:http://jsperf.com/document-getelementbyid-vs-jquery/3
$("#myId"); // 它始終比下邊的慢一點 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/
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/87500.html
摘要:對比內(nèi)部使用引擎,處理各種選擇器。引擎的選擇順序是從右到左,所以這條語句是先選,然后再一個個過濾出父元素,這導致它比最快的形式大約慢。這條語句與上一條是同樣的情況。 使用最新版本 因為新版本會改進性能,還有很多新功能 用對選擇器 最快的選擇器:id選擇器和元素標簽選擇器原因:遇到這些選擇器的時候,jQuery內(nèi)部會自動調(diào)用瀏覽器的原生方法(比如getElementById()),所以...
摘要:所以,最佳選擇是。事實上,這種處理完全不必要。這樣的設計,使得讀取局部變量比讀取全局變量快得多。請看下面兩段代碼,第一段代碼是讀取全局變量第二段代碼是讀取局部變量第二段代碼讀取變量的時候,不用前往上一層作用域,所以要比第一段代碼快五六倍。 轉(zhuǎn)自:http://www.ruanyifeng.com/blog/2011/08/jquery_best_practices.html ...
摘要:所以,最佳選擇是。事實上,這種處理完全不必要。這樣的設計,使得讀取局部變量比讀取全局變量快得多。請看下面兩段代碼,第一段代碼是讀取全局變量第二段代碼是讀取局部變量第二段代碼讀取變量的時候,不用前往上一層作用域,所以要比第一段代碼快五六倍。 轉(zhuǎn)自:阮一峰 日期: 2011年8月 4日http://www.ruanyifeng.com/blo... 上周,我整理了《jQuery設計思想》。...
摘要:不允許在文件中直接依賴后端接口,組件繼承可以在組件內(nèi)部通過,繼承另一個組件當然實際開發(fā)中,還有一些行為的規(guī)范代碼提交前要有代碼要有測試報告測試了那些點異步請求的處理頁面布局一定要寫定位大段代碼一定要寫注釋參數(shù)一定要寫注釋 雖然vue可以當做jquery用,可是哪還有必要更換成vue?用 jquery不是很好嗎? 下面是實際 vue開發(fā)中,主推的開發(fā)實踐1,組建設計2,組件分層3,組件繼...
閱讀 3747·2023-04-25 19:56
閱讀 1732·2021-11-12 10:36
閱讀 1849·2021-11-08 13:19
閱讀 1600·2019-08-30 14:06
閱讀 3086·2019-08-30 11:01
閱讀 1804·2019-08-29 13:23
閱讀 2793·2019-08-29 11:18
閱讀 3497·2019-08-26 13:35