高效的jQuery代碼編寫技巧總結

来源:http://www.cnblogs.com/moqiutao/archive/2017/07/13/7163344.html
-Advertisement-
Play Games

緩存變數 DOM遍歷是昂貴的,所以儘量將會重用的元素緩存。 避免全局變數 jQuery與javascript一樣,一般來說,最好確保你的變數在函數作用域內。 使用匈牙利命名法 在變數前加$首碼,便於識別出jQuery對象。 使用 Var 鏈(單 Var 模式) 將多條var語句合併為一條語句,我建議 ...


緩存變數

DOM遍歷是昂貴的,所以儘量將會重用的元素緩存。

// 糟糕

h = $('#element').height();
$('#element').css('height',h-20);

// 建議

$element = $('#element');
h = $element.height();
$element.css('height',h-20);

避免全局變數

jQuery與javascript一樣,一般來說,最好確保你的變數在函數作用域內。

// 糟糕

$element = $('#element');
h = $element.height();
$element.css('height',h-20);

// 建議

var $element = $('#element');
var h = $element.height();
$element.css('height',h-20);

使用匈牙利命名法

在變數前加$首碼,便於識別出jQuery對象。

// 糟糕

var first = $('#first');
var second = $('#second');
var value = $first.val();

// 建議 - 在jQuery對象前加$首碼

var $first = $('#first');
var $second = $('#second'),
var value = $first.val();

使用 Var 鏈(單 Var 模式)

將多條var語句合併為一條語句,我建議將未賦值的變數放到後面。

var
  $first = $('#first'),
  $second = $('#second'),
  value = $first.val(),
  k = 3,
  cookiestring = 'SOMECOOKIESPLEASE',
  i,
  j,
  myArray = {};

請使用’On’

在新版jQuery中,更短的 on(“click”) 用來取代類似 click() 這樣的函數。在之前的版本中 on() 就是 bind()。自從jQuery 1.7版本後,on() 附加事件處理程式的首選方法。然而,出於一致性考慮,你可以簡單的全部使用 on()方法。

// 糟糕

$first.click(function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
});

$first.hover(function(){
    $first.css('border','1px solid red');
})

// 建議
$first.on('click',function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
})

$first.on('hover',function(){
    $first.css('border','1px solid red');
})

精簡javascript

一般來說,最好儘可能合併函數。

// 糟糕

$first.click(function(){
    $first.css('border','1px solid red');
    $first.css('color','blue');
});

// 建議

$first.on('click',function(){
    $first.css({
        'border':'1px solid red',
        'color':'blue'
    });
});

鏈式操作

jQuery實現方法的鏈式操作是非常容易的。下麵利用這一點。

// 糟糕

$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
});
$second.fadeIn('slow');
$second.animate({height:'120px'},500);

// 建議

$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);

維持代碼的可讀性

伴隨著精簡代碼和使用鏈式的同時,可能帶來代碼的難以閱讀。添加縮緊和換行能起到很好的效果。

$second.html(value);
$second.on('click',function(){
    alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500);

// 建議

$second.html(value);
$second
    .on('click',function(){ alert('hello everybody');})
    .fadeIn('slow')
    .animate({height:'120px'},500);

選擇短路求值

短路求值是一個從左到右求值的表達式,用 &&(邏輯與)或 ||(邏輯或)操作符。

// 糟糕

function initVar($myVar) {
    if(!$myVar) {
        $myVar = $('#selector');
    }
}

// 建議

function initVar($myVar) {
    $myVar = $myVar || $('#selector');
}

選擇捷徑

精簡代碼的其中一種方式是利用編碼捷徑。

// 糟糕

if(collection.length > 0){..}

// 建議

if(collection.length){..}

繁重的操作中分離元素

如果你打算對DOM元素做大量操作(連續設置多個屬性或css樣式),建議首先分離元素然後在添加。

// 糟糕

var
    $container = $("#container"),
    $containerLi = $("#container li"),
    $element = null;

$element = $containerLi.first();
//... 許多複雜的操作

// better

var
    $container = $("#container"),
    $containerLi = $container.find("li"),
    $element = null;

$element = $containerLi.first().detach();
//... 許多複雜的操作

$container.append($element);

熟記技巧

你可能對使用jQuery中的方法缺少經驗,一定要查看的文檔,可能會有一個更好或更快的方法來使用它。

// 糟糕

$('#id').data(key,value);

// 建議 (高效)

$.data('#id',key,value);

使用子查詢緩存的父元素

正如前面所提到的,DOM遍歷是一項昂貴的操作。典型做法是緩存父元素併在選擇子元素時重用這些緩存元素。

// 糟糕

var
    $container = $('#container'),
    $containerLi = $('#container li'),
    $containerLiSpan = $('#container li span');

// 建議 (高效)

var
    $container = $('#container '),
    $containerLi = $container.find('li'),
    $containerLiSpan= $containerLi.find('span');

避免通用選擇符

將通用選擇符放到後代選擇符中,性能非常糟糕。

// 糟糕

$('.container > *');

// 建議

$('.container').children();

避免隱式通用選擇符

通用選擇符有時是隱式的,不容易發現。

// 糟糕

$('.someclass :radio');

// 建議

$('.someclass input:radio');

優化選擇符

例如,Id選擇符應該是唯一的,所以沒有必要添加額外的選擇符。

// 糟糕

$('div#myid');
$('div#footer a.myLink');

// 建議
$('#myid');
$('#footer .myLink');

避免多個ID選擇符

在此強調,ID 選擇符應該是唯一的,不需要添加額外的選擇符,更不需要多個後代ID選擇符。

// 糟糕

$('#outer #inner');

// 建議

$('#inner');

堅持最新版本

新版本通常更好:更輕量級,更高效。顯然,你需要考慮你要支持的代碼的相容性。例如,2.0版本不支持ie 6/7/8。

摒棄棄用方法

關註每個新版本的廢棄方法是非常重要的並儘量避免使用這些方法。

// 糟糕 - live 已經廢棄

$('#stuff').live('click', function() {
  console.log('hooray');
});

// 建議
$('#stuff').on('click', function() {
  console.log('hooray');
});
// 註:此處可能不當,應為live能實現實時綁定,delegate或許更合適

利用CDN

谷歌的CND能保證選擇離用戶最近的緩存並迅速響應。(使用谷歌CND請自行搜索地址,此處地址以不能使用,推薦jquery官網提供的CDN)。

必要時組合jQuery和javascript原生代碼

如上所述,jQuery就是javascript,這意味著用jQuery能做的事情,同樣可以用原生代碼來做。原生代碼(或vanilla)的可讀性和可維護性可能不如jQuery,而且代碼更長。但也意味著更高效(通常更接近底層代碼可讀性越差,性能越高,例如:彙編,當然需要更強大的人才可以)。牢記沒有任何框架能比原生代碼更小,更輕,更高效(註:測試鏈接已失效,可上網搜索測試代碼)。

鑒於vanilla 和 jQuery之間的性能差異,我強烈建議吸收兩人的精華,使用(可能的話)和jQuery等價的原生代碼。

轉載地址:http://www.codeceo.com/article/jquery-coding-high-qulity.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面的話 Robots協議(也稱為爬蟲協議、機器人協議等)全稱是“網路爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。本文將詳細介紹爬蟲協議robots 概述 robots.txt文件是一個文本文件,是搜索 ...
  • 前段時間一直忙於期末考試和找實習,好久沒寫博客了。 這段時間做了個小項目,包含了翻頁和富文本編輯器Ueditor的兩個知識點,Ueditor玩的還不是很深,打算玩深後再寫篇博客。 要實現翻頁功能,只需要設置一個pageIndex即可,然後每次載入頁面時通過pageIndex去載入數據就行。 那麼我們 ...
  • 原創: "荊秀網 網頁即時推送 https://xxuyou.com" | 轉載請註明出處 鏈接: "https://blog.xxuyou.com/nodejs thinkjs study config/" 本系列教程以 ThinkJS v2.x 版本( "官網" )為例進行介紹,教程以實際操作為 ...
  • 在常見的用戶註冊頁面,需要用戶在本地選擇一張圖片作為頭像,並同時預覽。 常見的思路有兩種:一是將圖片上傳至伺服器的臨時文件夾中,並返回該圖片的url,然後渲染在html頁面;另一種思路是,直接在本地記憶體中預覽圖片,用戶確認提交後再上傳至伺服器保存。 這兩種方法各有利弊,方法一很明顯,浪費流量和伺服器 ...
  • html概念+三大元素inline,block,inline-block ...
  • 一.概述層疊樣式表;可以對HTML的元素,進行控制,使HTML的元素展現的效果和位置更好;二.基本語法css規則由兩個部分構成:選擇器和語句語句規則:1.css選擇器的名稱區分大小寫;屬性名和屬性值區分大小寫;2.每條語句的結尾都要使用;,最後一行可以省略;3.註釋格式:/**/4.css在html... ...
  • 函數的定義 1.函數的聲明 function 函數名(){ } 2.函數表達式 var aa=function(){ } 函數的調用 1.函數名() 函數分類:方式一: 有名函數 匿名函數(匿名函數無法直接調用,如果想要調用,需要使用匿名函數的自調用) ( function(){ alert(); ...
  • 首先,取值有以下兩種方式: 1:$('#com').combobox('getValue') 2:$('#com').combobox('getText) 區別就不說了。 作為選擇觸發事件,比較之後發現: onselect:事件觸發之後,獲取到的是改變之前的值 onsuncess:獲取到的是改變之後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...