【讀書筆記】鋒利的 jQuery

前一段在噹噹和京東上趁著打折買了十幾本編程的書,勵志要全部看完!在此立一個 flag,最近也是一直在讀書,發現書中更能深入的學到系統的知識。並且如果再能將書中的內容用自己的語言表達出來那就更好了。

本文首發於我的個人網站: cherryblog.site/

本文作者: Cherry

本文鏈接: cherryblog.site/sharp-j

版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 許可協議。轉載請註明出處!!

書名:《鋒利的 jQuery》

簡介:這本書適合初學 JS 的童靴看~內容比較基礎,我是想看 JQ 源碼,然後發現和源碼沒有半毛錢關係,只是比較全的介紹 jQuery 的用法。對沒有系統看過 jQuery 用法的,或者 js 的初學者還是有一定幫助的,但是如果你有一定的 js 基礎,還是不要浪費時間了。其實 jQuery 好多的用法我們並不清楚,只是將 jQuery 當做方便的元素選擇器來使用,其實 jQuery 能做的遠比這多得多。

推薦指數:☆☆☆

jQuery 的優勢

  • 強大的選擇器
  • 出色的 DOM 操作的封裝
  • 可靠的事件處理機制
  • 完善的 Ajax
  • 不污染頂級變數
  • 出色的瀏覽器兼容性
  • 鏈式操作方式
  • 隱式迭代
  • 行為層與結構層分離
  • 豐富的插件支持
  • 完善的文檔
  • 開源

不污染頂級變數

jQuery 只建立一個名為 jQuery 的對象,其所有的函數方法都在這個對象之下。其別名 也可以隨時交出控制權,絕對不會污染其他變數。該特性使 jQuery 可以與其他 JavaScript 庫共存。

鏈式操作方式

jQuery 的鏈式操作方式:對放生在同一個 jQuery 對象上的一組動作,可以直接連寫而無需重複獲取對象。

隱式迭代

當用 jQuery 找到帶有 「.myClass」 類的全部元素,然後隱藏它們時,無需循環遍歷每一個返回的元素。jQuery 里的方法都被設計成自動操作對象集合,而不是單獨的對象

jQuery 代碼的編寫

在 jQuery 庫中, 就是 jQuery 的一個簡寫形式,例如 $(#.foo) 與 jQuery(#.foo) 是等價的

window.onload 和 $(document).ready() 對比

--window.onload$(document).ready()執行時間必須等待網頁中所有的內容載入完畢()包括圖片才執行只需要 DOM 載入完就執行(不包括圖片等)編寫個數不能同時編寫多個能同時編寫多個簡化寫法無$(document).ready(function(){}) 可以簡寫成 $(function(){})

jQuery 的鏈式操作風格

jQuery 的鏈式操作方式:對放生在同一個 jQuery 對象上的一組動作,可以直接連寫而無需重複獲取對象。 例如:

$(this).addClass("current").next().show().parent().siblings().children("a").removeClass("current").next().hide();n

為了閱讀方便,也可以將代碼改為如下格式:

$(this).addClass("current") // 給當前元素添加 "current" 樣式n .next().show() // 下一個元素顯示n .parent().siblings().children("a").removeClass("current") // 父元素的同輩元素的子元素 <a> 移除 "current" 樣式n .next().hide(); // 他們的下一個元素隱藏n

jQuery 對象和 DOM 對象

DOM 對象就是 DOM 樹種的節點,通過原生 JavaScript 的 getElementsByTagName 或者 getElementsByTagId 等獲取,DOM 對象可以使用 JavaScript 中的方法。

jQuery 對象是通過 jQuery 包裝 DOM 過後的對象。

在 jQuery 對象上無法使用 DOM 對象的任何方法,同理,也不能在 DOM 對象上使用任何 jQuery 的方法啊。所以我們要區分什麼是 jQuery 的方法,什麼是 JS 原生的方法。例如,下面這些都是錯誤的

$("#id").innerHTMLn $("#id").checkedn document.getElementById("id").html()n

jQuery 對象和 DOM 對象相互轉換

為了能更好的區分哪些是 jQuery 哪些是 DOM 對象,我們約定俗成使用 jQuery 獲取的對象我們在變數前面加上 符號。

jQuery 對象轉化為 DOM 對象

  1. [index] 方法,就是在 jQuery 對象後面加上索引,比如:

var $cr = $(#cr); // jQuery 對象n var cr = $cr[0]; // 將 jQuery 轉化為 DOM 對象n alert( cr.checked ); // 檢查是否轉化成功n

  1. get(index) 方法

var $cr = $(#cr); // jQuery 對象n var cr = $cr.get(0); // 將 jQuery 轉化為 DOM 對象n alert( cr.checked ); // 檢查是否轉化成功n

DOM 對象轉化為 jQuery 對象

DOM 對象轉化為 jQuery 對象很簡單,只需要用 $() 將 DOM 對象包裝起來就好。

var cr = document.getElmentByID("cr"); // DOM 對象n var $cr = $(cr) // 將 DOM 對象轉為 jQuery 對象n

解決 jQuery 和其他庫的衝突

之前遇到過類似的問題,是使用的插件需要較低版本的 jQuery(因為不進行維護了),然後和項目中使用的較高版本的 jQuery 不兼容,所以在網上查到了一個項目中是可以使用兩個不同版本的 jQuery 的。

在 jQuery 庫中,幾乎所有的插件都被限制在它的命名空間里。通常,全局對象都被很好地儲存在 jQuery 的命名空間里。因此和其他庫一起使用時,不會引起衝突。

默認情況下,jQuery 用 $ 作為自身的快捷方式。

jQuery 庫在其他庫之後導入

在其他庫和 jQuery 庫都被載入完畢後,可以在任何時候調用 jQuery.noConflict() 函來將變數 的控制權移交給其他 JavaScript 庫。

// 引入 其他 JS 庫n // 引入 jQueryn <script>n jQuery.noConflict(); // 將變數 $ 的控制權移交給其他 JS 庫n jQuery(function(){n jQuery("p").click(function){n alert( jQuery(this).text() );n }n })n </script>n

也可以自定義一個快捷方式:

// 引入 其他 JS 庫n // 引入 jQueryn <script>n $j.noConflict(); // 將變數 $ 的控制權移交給其他 JS 庫n $j(function(){n $j("p").click(function){n alert( $j(this).text() );n }n })n </script>n

如果你還想繼續使用 而不管其他函數的 $() 方法,同時又不想與其他庫衝突,那麼你可以

jQuery.noConflict(); // 將變數 $ 的控制權移交給其他 JS 庫n (function( $ ){ // 定義匿名函數並設置形參 $n $("p").click(function){n alert( $(this).text() );n };n }(jQuery)); // 執行匿名函數並設置形參 jQueryn

jQuery 庫在其他庫之前導入

如果 jQuery 庫在其他庫之前導入,那麼就可以直接使用「jQuery」來做一些 jQuery 的工作,同時可以使用 $() 方法作為其他庫的快捷方式(也就是說不需要寫 jQuery.noConflict();

jQuery 選擇器

基本選擇器

選擇器描述返回#id根據給定的 ID 匹配一個元素單個元素.class根據給定的類名匹配一個元素集合元素element根據給定的元素名匹配一個元素(相當於 tagName )集合元素*匹配所有元素集合元素select1,select2,select3將每一個選擇器匹配到的元素合併後一起返回集合元素

層次選擇器

選擇器描述返回ancestor descendant(空格)選取 ancestor 元素里所有的 descendant(後代)元素集合元素parent > child選取子元素集合元素prev + next選取緊接在 prev 元素後面的 next 元素集合元素prev + siblings選取 prev 元素之後的所有 siblings 元素集合元素

過濾選擇器

選擇器描述返回:first選取第一個元素單個元素:last選取最後一個元素單個元素:not(selector)去除所有與給定選擇器匹配的元素集合元素:even索引為偶數(索引從 0 開始)集合元素:odd索引為奇數(索引從 0 開始)集合元素:eq(index)索引等於 index 的元素(index 從 0 開始)單個元素:gt(index)索引大於 index集合元素:lt(index)索引小於 index集合元素:header(index)所有的標題元素 h1、h2、h3 等集合元素:animated正在執行動畫的所有元素集合元素:focus當前獲取焦點的元素集合元素

內容過濾選擇器

選擇器描述返回:contains(text)文本中含有 「text」 的元素集合元素:empty不包含子元素或者文本的空元素集合元素:has(selector)含有選擇器所匹配的元素集合元素:parent含有子元素或文本集合元素:hidden選取所有不可見的元素集合元素:visible選取所有可見的元素集合元素

屬性過濾選擇器

選擇器描述返回示例[attribute]擁有此屬性的元素集合元素$("div[id]") 選擇所有擁有 id 屬性的 div[attribute=value]屬性的值為 value 的元素集合元素$("div[tittle = test]") 屬性 title 為 test 的 div[attribute!=value]屬性的值不為 value 的元素集合元素$("div[tittle != test]") 屬性 title 不為 test 的 div[attribute^=value]屬性的值以 value 開始的元素集合元素$("div[tittle^ = test]") 屬性 title 以 test開始的 div[attribute$=value]屬性的值為 value 結束的元素集合元素[attribute*=value]屬性的值含有 value 的元素集合元素[attribute|=value]屬性的值等於或者以該字元串為前綴(該字元後跟 - 字元)的元素 value 的元素集合元素[attribute~=value]屬性的用空格分隔的值中包含一個給定的 value集合元素[attribute][attrubute][attribute]用屬性選擇器合併成一個複合屬性選擇器,滿足多個條件,每選擇一次,縮小一次範圍集合元素

子元素過濾選擇器

選擇器描述返回:nth-child(index/even/odd/equation)選取每個父元素下的第 index 個子元素或者奇偶元素(index 從 1 開始)集合元素:first-child選取每個父元素第一個子元素集合元素:last-child選取每個父元素最後一個子元素集合元素:only-child如果某個元素是它父元素中唯一的子元素,則會被匹配集合元素

表單過濾選擇器

選擇器描述返回:enabled選取所有可用元素集合元素:disable選取所有不可用元素集合元素:checked選取所有被選中元素(複選框、單選框)集合元素:selected選取所有被選中元素(下拉列表)集合元素

表單選擇器

選擇器描述返回:input選取所有的 <input> <textarea> <select> <button>集合元素:text選擇所有單行文本框集合元素:password選擇所有的密碼框集合元素:radio選擇所有的單選框集合元素:checkout選擇所有的多選框集合元素:submit選擇所有的提交按鈕集合元素:image選擇所有的圖像按鈕集合元素:reset選擇所有的重置按鈕集合元素:button選擇所有的按鈕集合元素:file選擇所有的上傳域集合元素:hidden選擇所有的不可見元素集合元素

jQuery 選擇器完善的處理機制

  • 如果元素不存在時,JS 不會保存阻塞其他代碼的運行。
  • $(#ID) 或者其他選擇器獲取的永遠是對象,即使網頁上沒有此元素。使用 jQuery 檢查某個元素是否存在要不能使用

if( $(#tt) ){n dosomethingn }n

而是根據元素是否有長度判斷:

if( $(#tt).length > 0 ){n dosomethingn }n

或者轉化為 DOM 元素來判斷

if( $(#tt)[0] ){n dosomethingn }n

jQuery 中的 DOM 操作

HTML DOM 操作

插入節點

方法描述示例append()向每個匹配的元素內部追加內容$(A).append(B) 將 B 追加到 A 中appendTo()將所有匹配的元素追加到指定元素中$(B).appendTo(A) 將 B 追加到 A 中prepend()向每個匹配的元素內部前置內容after()在每個匹配的元素之後插入內容$(A).after(B) 將 B 插入到 A 後面insertAfter()將所有匹配的元素插入到指定元素的後面$(B).insert After(A) 將 B 插入到 A 後before()在每個匹配的元素之前插入內容$(A).before(B) 將 B 插入在 A 的前面insertBefore()將所有匹配的元素插入到指定元素的前面$(B).insertBefore(A) 將 B 插入在 A 的前面

刪除節點

remove()

從 DOM 中刪除所有匹配的元素,傳入的參數用於根據 jQuery 表達式來刪選元素

$("ul li:eq(1)").remove(); // 獲取第二個 <li> 元素節點後,將它從網頁中刪除n $li.appendTo("ul"); // 把剛才刪除的元素添加到 <ul> 元素中n

這個方法的返回值是一個指向已被刪除的節點的引用,因此可以將其保存在一個變數中,以後還可以使用。

detach()

detach() 和 delete() 一樣,也是從 DOM 中去掉所有匹配的元素,但是兩者的區別是,這個方法不會把匹配的元素從 jQuery 對象中刪除,去掉的元素的所有綁定的事件、附加的數據等都會保留下來。

empty()

清空元素中所有的後代節點。注意是清空元素內的所有節點,並不清除選中的元素

複製節點

複製節點可以使用 clone() 方法

$("ul li").click(function(){n $(this).clone().appendTo("ul");n })n

但是這樣複製的節點,被複制的新元素並不具有任何行為,如果需要新元素也具有相同的行為,那麼就需要在 clone() 方法中傳入參數 true

$("ul li").click(function(){n $(this).clone(true).appendTo("ul");n })n

其他方法

方法名描述replaceWith()將所有匹配的元素都替換成 HTML 或者 DOM 元素,綁定的事件將會消失replaceAll()和 replaceWith() 相反wrap()將所有的元素單獨包裹wrapAll()將所有匹配的元素用一個元素來包裹 如果被包裹的元素中間有其他的元素,那麼其他的元素會被放到包裹元素之後wrapInner()將每一個匹配的元素的字內容(包括文本節點)用其他結構化的標記包裹起來attr()獲取和設置元素屬性,傳遞一個參數為獲取元素屬性,傳遞兩個參數為設置元素屬性removeAttr()刪除文檔中某個元素的特定屬性addClass()追加樣式removeClass()移除樣式 如果參數為空,則清空該元素的所有 classtoggleClass()切換樣式 如果類名存在則刪除,如果類名不存在則添加hasClass()是否含有某個樣式,返回布爾值html()讀取或者設置某個元素中的 HTML 內容 傳遞一個參數為獲取 HTML 中的內容,傳遞兩個參數為設置 HTML 的內容text()讀取或者設置某個元素中的文本內容 傳遞一個參數為獲取文本內容,傳遞兩個參數為設置文本內容val()讀取或設置元素的值 在用於表單元素時,可以設置相應的元素被選中children()獲得匹配元素的子元素的集合 (子元素非後代元素)next()獲得匹配元素後面緊鄰的同輩元素prev()獲得匹配元素前面緊鄰的同輩元素siblings()獲得匹配元素前後面緊鄰的同輩元closest()取得最近的匹配元素parent()獲得集合中每個元素的父級元素parents()獲得集合中每個元素的祖先元素closest()從元素本身開始,逐級向上級元素匹配,並返回最先匹配的祖先元素

CSS DOM 操作

方法描述css()讀取和設置 style 對象的各種屬性(如果值是數字,將會自動轉化為像素值,樣式名不帶

「」樣式使用駝峰寫法) offset() | 獲取元素在當前視窗的相對偏移,返回的對象包含兩個屬性 top、left position() | 獲取元素相對於最近一個 position 樣式屬性設置為 relation 或者 absolute 的父節點的相對偏移 scrollTop() 、scrollLeft() | 獲取元素滾動條距離頂端的距離和距離左側的距離

JS 中的事件

事件綁定

bind(type [, date ], fn )n

  1. 第一個參數是事件類型,類型包括:blur focus load resize scroll unloadcliock dblclick mousedown mouseup mouseover mouseout mouseentermouseleave change select submit keyup keydown keypress keyup error
  2. 第二個參數為可選參數,作為 event.data 屬性值傳遞給事件對象的額外數據對象
  3. 第三個參數是用來綁定的處理函數

jQuery 的事件處理函數比 JS 原生的事件處理函數少了個 on

像 click mouseover mouseout 這類事件,可以直接簡寫

合成事件

jQuery 中有兩個合成事件,hover() toggle()

hover()

hover(enter,leave)n

hover(fn1,fn2,...fnN) 方法用於模擬游標懸停事件,當游標移動到元素上時,會觸發第一個函數(enter),當游標移出這個元素時會觸發第二個函數(leave)

toggle()

toggle() 方法用於模擬滑鼠的連續點擊事件,第一次單擊元素,觸發第一個函數,第二次單擊同一個元素,會觸發第二個函數,如果有更多的函數,則依次觸發,直到最後一個。

事件冒泡

假設網頁上有兩個元素,其中一個嵌套在另一個元素裡面,並且都被綁定了 click 事件。同時 <body> 元素上也綁定了 click 事件,這樣的話,點擊最內層的元素,會觸發三次 click 事件。這是因為 JavaScript 的事件冒泡機制。

在 jQuery 中,提供了 stopPropagation() 方法來停止冒泡。

阻止默認行為

網頁中有自己的默認行為,例如單擊超鏈接會跳轉,單擊「提交」按鈕後表單會提交,有時需要阻止默認行為。

jQuery 提供了 preventDefault() 方法來阻止元素的默認行為。

事件對象的屬性

方法名稱描述event.type獲取到事件的類型event.preventDefault()阻止默認的事件行為stopPropagation()阻止事件冒泡event.tagent()獲取到觸發事件的元素event.relatedTarget()mousover 和 mouseout 所發生的元素event.pageX event.pageY獲取到游標相對於頁面的 x 坐標和 y 坐標event.which()滑鼠單擊事件中獲取到的左、中、右鍵,在鍵盤事件中獲取鍵盤的按鍵event.metaKey()為鍵盤事件獲取 ctrl 鍵

移除事件

unbind([type],[data])n

第一個參數是事件類型,第二個參數是要移除的函數。 如果沒有參數,則刪除所有的綁定事件

one() 方法

對於只要觸發一次,隨後要立即解除綁定的情況,jQuery 提供了 one() 方法。 當處理函數觸發一次後,立即被刪除。

模擬操作

trigger() 方法完成模擬操作,

trigger(type,[data])n

第一個參數是要觸發的事件類型,第二個參數是要傳遞給事件處理函數的附加參數,可以通過傳遞的參數來區分這次事件是代碼觸發還是用戶觸發的

jQuery 中的動畫

方法名說明hide() show()同時修改多個樣式屬性,即高度、寬度和不透明度fadeIn() fadeOut()只改變不透明度slideUp() slideDown()只改變高度toggle()用來代替 hide() 和 show() 方法slideToggle()用來代替 slideUp() 和 slideDown()fadeToggle()用來代替 fadeIn() 和 fadeOut()animate()屬於自定義動畫的方法

jQuery 中的任何動畫效果,都可以指定三種速度參數,slow、normal、fast,對應的時間長度分別是 0.6 秒,0.4 秒和 0.2 秒,也可以傳入參數,傳入數字作為參數不需要加引號,使用關鍵字需要加引號。

動畫隊列

當一個 animate() 方法中應用多個屬性時,動畫是同時發生的。 當以鏈式方法調用時,動畫是按順序發生(除非 queue 選項為 false)。 默認情況下,動畫都是同時發生的。 當以回調的形式應用動畫方式時,按照回調順序發生。

停止動畫

stop([clearQueue,gotoEnd])n

clearQueue 是否要清空未執行的動畫隊列 gotoEnd 是否直接跳轉到末狀態

判斷元素是否處於動畫狀態

**要始終避免動畫累計而導致的動畫與用戶行為不一樣的情況。**當用戶快速在某個元素上執行 animate() 時,就會出現動畫累加。

解決方法是判斷元素是否處於動畫狀態,如果用戶不處於動畫狀態,才為元素添加新的動畫,否則不添加。

延遲動畫

在動畫執行的過程中,如果想對動畫進行延遲操作,那麼可以使用 delay() 方法。

jQuery 與 Ajax

Ajax 的優勢

  • 不需要插件的支持
  • 優秀的用戶體驗
  • 提高 Web 程序的性能
  • 減輕伺服器和帶寬的負擔

Ajax 的不足

  • 瀏覽器對 XMLHttpRequest 對象的支持度不足
  • 破壞瀏覽器前進後退按鈕的正常功能
  • 對搜索引擎的支持程度不夠
  • 開發和調試工具的缺乏

使用原生 JS 寫一個 Ajax

  1. 定義一個函數,通過該函數來獲取非同步信息

function Ajax(){ // 定義一個函數,通過該函數來獲取非同步信息n n }n

  1. 聲明一個空對象來裝入 XMLHttpRequest 對象

var xmlHttpReq = null; // 聲明一個空對象來裝入 XMLHttpRequest 對象n

  1. 實例化一個 XMLHttpRequest 對象

if(window.XMLHttpRequest){n xmlHttpReq = new XMLHttpRequest(); // 實例化一個 XMLHttpRequest 對象n }n

  1. 使用 open() 方法初始化 XMLHttpRequest 對象,指定 HTTP 方法和要使用的伺服器 URL;

xmlHttpReq.open("GET","test.php",true); // 調用 open() 方法並採用非同步方式n

  1. 使用 onreadystatechange 屬性來註冊該回調事件處理器,當 readystatus 狀態改變時,會激發 onreadystatechange 事件然後調用回調函數。

xmlHttpReq.onreadystatechange = RequestCallBack;n

  1. 使用 send() 方法發送請求,使用 GET 方式可以不指定參數或者使用 null 參數

xmlHttpReq.send(null);n

  1. 當請求狀態改變時,XMLHttpRequest 對象調用 onreadystatechange 屬性註冊的事件處理器,在處理響應之前,事件處理器應該首先檢查 readyStatus 的值和 HTTP 狀態。當請求完成載入(readyStatus == 4)並且響應已經成功(HTTP 狀態值為 200),就可以處理響應內容;

function RequestCallBack() {n if(xmlHttpReq.readyState == 4){n if(xmlHttpReq.status == 200){n document.getElementById("resText").innerHTML = xmlHttpReq.responseText;n }n }n }n

jQuery 中的 Ajax

jQuery 對 Ajax 操作進行封裝,在 jQuery 中,$.ajax() 是最底層的方法,第二層是 load()、$.get()、$.post()、$.grtJSON()。

load() 方法

載入 HTML 文檔

load( url [,data] [,callback])n

參數列表類型說明urlString請求 HTML 頁面的 URL 地址dataObject發送至伺服器的 key/value 數據callbackFunction請求完成時的回調函數,無論請求失敗或成功

比如說我們要將一個頁面追加到另一個頁面,被追加的文件為 inner.html,內容如下

<!DOCTYPE html>n<html lang="en">n<head>n <meta charset="UTF-8">n <title>Title</title>n</head>n<body>nn<p>測試</p>nn</body>n</html>n

內容只有一個 <p> 標籤,然後我們創建另一個頁面,用來觸發 Ajax 事件,並用來顯示追加的 HTML,頁面內容如下:

<!DOCTYPE html>n<html lang="en">n<head>n <meta charset="UTF-8">n <title>Title</title>n <script src="../jQuery.min.js"></script>n</head>n<body>n<input type="button" id="send" value="獲取">n<div id="resText"></div>nn<script>n $(function () {n $(#send).click(function () {n $(#resText).load(inner.html)n })n })n</script>n</body>n</html>n

當,點擊按鈕時,頁面如下:

載入部分 HTML 文檔

當前我們也可能載入部分的 HTML 文檔,例如只需要載入 inner.html 中的 test 類,那麼:

$(#resText).load(inner.html .test)n

傳遞方式,如果沒有設置傳遞方式,那麼使用 GET 方式,如果有傳遞參數,那麼為 POST 方式。

回調

$(#resText).load(inner.html .test, functiong(responseText,textStatus,XMLHttpRequest){n // responseText : 請求返回的內容n // textStatus : success、error、notmodified、timeoutn // XMLHttpRequest : XMLHttpRequest 對象n })n

$.get() 方法

$.get() 方法使用 GET 方式來進行非同步請求

$.get( url [, data] [, callback] [, type])n

參數名稱類型說明urlString請求 HTML 頁的 URL 地址data(可選)Object發送至伺服器的 key/value 數據會作為 QueryString 附加到請求 URL 中callback(可選)Function載入成功時回調函數(只有當 Reaponse 的返回狀態是 success 才調用)自動將請求的結果和狀態傳遞給方法type(可選)String伺服器端返回內容的格式,包括 xml、html、script、json、text、_default

$.post() 方法

$.post() 方法使用 GET 方式來進行非同步請求

$.post( url [, data] [, callback] [, type])n

GET 方式和 POST 請求方式的區別

  • GET 請求將參數跟在 URL 後進行傳遞,POST 則作為 HTTP 消息的實體內容發送給 web 伺服器,
  • GET 方式通常傳遞的數據不超過 2kb,POST 方式理論上沒有限制
  • GET 方式請求的數據會被瀏覽器緩存起來,

$.ajax() 方法

$.ajax() 方法是 jQuery 最底層的 Ajax 實現,

$.ajax(option)n

參數名稱類型說明urlString發送請求的 URL(默認為當前頁面)typeString請求方式,默認為 GETtimeoutNumber設置請求超時時間(毫秒)dataObject 或 String發送到伺服器的數據dataTpyeString預期伺服器返回的數據類型beforeSendFunction發送請求前可以修改 XMLHttpResponse 對象的函數completeFunction請求完成後調用的回調函數(請求失敗或者成功均調用)successFunction請求成功後調用的回調函數errorFunction請求失敗後調用的回調函數globalFunction默認為 true。是否觸發全局 Ajax 事件

序列化元素

serialize() 方法能夠將 DOM 元素內容序列化為字元串,用於 Ajax 請求。即使在表單中再增加欄位,腳本仍然能夠使用。並且不需要做其他多餘工作。

serializeArray() 方法,該方法不是返回字元串,是將 DOM 序列化後,返回 JSON 格式的數據。

$.param() 方法,用來對一個數組或對象按照 key/value 進行序列化。

var obj = {a:1,b:2,c:3};n var k = $.param(obj);n alert(k); // 輸出 a=1&b=2&c=3n

jQuery 性能優化

使用合適的選擇器

  1. $("#id") id 選擇器無疑是最佳提高性能的方式。因為 jQuery 底層直接調用本地方法 document.getElementById(),直接通過 id 返回對應的元素可以有效的縮小你定位的 DOM 元素,建議從最近的 ID 元素開始往下搜索
  2. $("p")、$("div")、$("input") 標籤選擇器是性能優化第二選擇,因為 jQuery 也是直接調用 JS 原生方法
  3. $(".class") 這是 jQuery 封裝的函數,ie9+ 以上是使用 JS 的原生方法,ie9 一下是使用 DOM 搜索方式來實現
  4. $("[attribute=value]"):利用屬性來定位 DOM 元素,大部分都是使用 DOM 搜索方式來達到效果。所以性能並不是很理想
  5. $(":hidden"):這和上面利用屬性類似,並且 jQuery 需要搜索每一個元素來定位這個選擇器,所以盡量不要使用。

緩存對象

我們可以將經常用的對象使用變數緩存起來,因為 jQuery 會在創建每一個選擇器的過程中,查找 DOM。 不要讓相同的選擇器在你的代碼中出現多次。

循環時的 DOM 操作

在一些循環時,例如 for()、while()、$.each() 使用這些方法處理 DOM 元素時,要儘可能的減少操作 DOM,可以使用變數將來儲存元素,最後一次性將生產的 DOM 插入或者刪除。

數組方式使用 jQuery 對象

使用 jQuery 選擇器獲得的結果是一個 jQuery 對象,然而,jQuery 類庫會讓你感覺你正在使用一個定義了索引和長度的數組。在性能方面,建議使用 for 或者 while 循環來處理,而不是 $.each()

事件代理

每一個 JavaScript 事件(例如:click、mouseover 等)都會冒泡到父節點,當我們需要給多個元素調用同個函數時會很有用。

比如,我們要單擊表格的行使得改行背景顏色改變

$("myTable td").click(function(){n $(this).css("background",red)n })n

如果你是這樣寫的話,那麼恭喜你,提供了一個錯誤的示例,????。這樣的弊端是,假使總共有 100 個 td,那麼在使用以上方式的時候,你綁定了 100 個事件,天辣,是不是很恐怖。

正確的姿勢是,只需要向他們的父節點綁定一次事件,然後通過 event.target 獲取到當前點擊的元素。

$("myTable").click(function(){n var $clicked = $(e.target); // 捕捉到觸發的目標元素n $clicked.css("background",red);n })n

也可以這樣寫

$("myTable td").on(click,td, function(){n $(this).css("background",red)n })n

推薦閱讀:

DDFE 技術周刊(第一期)2016.11.04
2018前端值得關注的技術
CSS 中,為什麼絕對定位(absolute)的父級元素必須是相對定位(relative)?
阿里雲前端周刊 - 第 32 期
react-router頁面滾動時,頁面位置問題?

TAG:前端开发 | 前端框架 |