Jquery的dom操作與原生dom的轉換


本片文章包含了

  • jquery常見dom操作、
  • q與原生dom對象的區別與轉換
  • 偽數組對象的知識

如有錯誤,煩請指正。

以下方法共性:可以一次添加多個內容,內容可以是DOM對象、HTML string、 jQuery對象

創建元素

var obj = $('<div class="test"><p><span>Done</span></p></div>');

兩種方法可以創建元素

  1. 直接寫入html
  2. 傳入一個原生dom

添加元素

append()

可以傳入dom對象,html string,jq對象等等;傳到尾部;

appendTo()

與前者相比,主次不同;這里是將孩子添加到某個父元素中;

prepend()

append()相似,但是是傳入到頭部;

prependTo

主次關系同appendTo();

before()after()

在對象前面/后面,與對象並列同級的位置插入內容,參數類型和append()相同;

insertBefore()insertAfter()

before()主次不同,把xx插入到xx前面;

.remove()

可以傳入一個選擇器進行過濾,刪除被選元素和所有自元素;

.empty()

刪除調用該方法的元素下所有子元素,調用元素本身不刪除;

包裹

.wrap()

為調用這個api的對象包裹一層html結構;可以傳入selector,element,jq對象,html string等等;

wrapAll()wrapInner()

這兩個api是wrap()的延伸,前者將整個選取的對象包裹起來;后者在選取的對象內部套一層;

unwrap()

這個方法將移出元素的父元素。這能快速取消 .wrap()方法的效果。將匹配的元素(以及他們的同輩元素)DOM結構的上一層父元素剝離出去;

HTML相關

html()

可讀寫的api,即沒有參數時,可讀取元素的innerHTML,當傳遞了string參數,則修改元素的innerHTML

$("p").html("Hello <b>world</b>!");

這種可讀寫的api是jquery的重要設計思想,后續會有很多類似的方法;

text()

可讀寫,操作dom的innerText

val()

返回或設置元素值,處理input的value屬性值等;

jq與原生dom對象的區別與轉換

dom對象是我們用原生js獲得的對象,jQuery對象就是用jQuery的類庫選擇器獲得的對象。jQuery對象是它本身獨有的,和原生對象不可混用,同樣,dom對象也不可以混用jq對象的方法!

比如,以下兩行代碼的作用是相同的

$("#color").html();
document.getElementById("color").innerHTML;

$("#id").innerHTML; // 錯誤寫法

jq對象 > dom

jquery提供了兩個方法可以實現jq對象轉換為dom對象,即[index]get(index),因為jquery對象實際上是偽數組對象!

var $cr = $("#cr"); //jquery對象
var cr = $cr[0]; //dom對象,也可寫成 var cr= $cr.get(0);
alert(cr.checked); //檢測這個checkbox是否給選中

dom對象 > jq對象

對於一個dom對象,只需要用$()把dom對象包裝起來,就可以獲得一個jquery對象了,方法為$(dom對象);
復制代碼 代碼如下:

var cr = document.getElementById("cr"); //dom對象
var $cr = $(cr); //轉換成jquery對象

偽數組對象

我們再進一步探討下jquery對象與dom對象的轉換的細節。

在jQuery的中有一個包裝集概念,包裝集就是用偽數組實現的。先看下正常的數組的定義及遍歷:

var arr = ['iceman' , 'mengzhe' , 'shoushou' , 'zhuzhu'];
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

執行結果依次輸出四個屬性,這是最為正常的數組遍歷:用字面量的形式定義了一個數組,並且添加幾個簡單的字符串,以及遍歷輸出每一項,這個在JavaScript中是再正常不過了。那么,什么是偽數組呢?.... 就是用對象來模擬的!

var objArr = {
    0 : 'iceman',
    1 : 'mengzhe',
    2 : 'shoushou',
    3 : 'zhuzhu',
    length : 4
}
for (var i = 0; i < objArr.length; i++) {
    console.log($objArr[i]);
}

執行結果還是依次輸出了四個屬性。

以上代碼中以對象字面量的形式定義了一個對象objArr,這個對象就用來模擬數組,即偽數組對象,在$arr中要偽裝的數組項以數字0、1、2...為鍵,值便是原數組的值。

js中獲取一個對象的屬性值可以使用obj.prop或者obj['prop'],當對象字面量中鍵是以數字開頭的時候,用obj['prop']獲取值的時候可以不加引號,即obj[prop],在上面的實例中就是objArr[1]、objArr[2]、objArr[3]....

看到這里有沒有一種很似曾相識的感覺呢? 前面說到,jQuery對象轉原生DOM對象的其中一種方式是:jQuery對象[0],和以上的對象字面量中鍵是數字的形式是不很像呢? 另外多說一句,jQuery對象.get(0)的內部使用的就是jQuery對象[0]來實現的。

偽數組驗證

jQuery使用選擇器獲取的對象會被包裝為一個包裝集,該包裝集的內部實現就是使用偽數組對象:
屏幕快照 2018-05-18 下午6.16.44.png
通過打斷點的方式,用選擇器獲取的所有的確都封裝了一個偽數組對象。所以使用$divs[0]獲取的就是$divs對象中的鍵為0的div元素,即第一個div元素。
屏幕快照 2018-05-18 下午6.20.58.png
$divs[0]get()獲取的是第一個,並且獲取的是原生的DOM對象,那么如果用選擇器只獲取到了一個元素,那么用$divs[0]獲取的就是該元素的原生DOM對象,這就是jQuery對象轉為原生DOM對象。

有了上文的理解,原生DOM對象轉jQuery對象理解起來就簡單多了,$(原生DOM對象)的方式可以將原生DOM對象轉為jQuery對象,其實$是一個方法,原生的DOM對象傳入$方法中,該方法內部對原生DOM對象做進一步的加工, 使其成為一個包裝集,即偽數組對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM