天天看點

DOM-Node類型

DOM(文檔隊形模型)是針對HTML和XML文檔的一個API(應用程式程式設計接口)。DOM描繪了一個階層化的節點樹,允許開發人員添加,移除和修改頁面的一部分。DOM可以講任何HTML和XML文檔描繪成一個有多層次節點構成的結構。節點分為幾種不同的類型,每種類型分别表示文檔中不同的資訊。每個節點都擁有各自的特點、資料和方法,另外也與其他節點存在某種關系。節點之間的關系構成了層次,而所有頁面标記則表現為一個以特定節點為根節點的樹形結構。總共有12種節點類型,這些類型都繼承自一個基類型-Node類型

Node類型

DOM1級定義了一個Node接口,Javascript中的所有節點類型都繼承自Node類型,是以所有節點類型都共享着相同的基本屬性和方法,每個節點都有一個nodeType屬性,用于表明節點的類型。節點類型由在Node類型中定義的下列12個數值常量來表示,任何節點類型必居其一:

Node.ELEMENT_NODE (1) 

Node.ATTRIBUTE_NODE (2) 

Node.TEXT_NODE (3) 

Node.CDATA_SECTION_NODE (4) 

Node.ENTITY_REFERENCE_NODE (5) 

Node.ENTITY_NODE (6) 

Node.PROCESSING_INSTRUCTION_NODE (7) 

Node.COMMENT_NODE (8) 

Node.DOCUMENT_NODE (9) 

Node.DOCUMENT_TYPE_NODE (10) 

Node.DOCUMENT_FRAGMENT_NODE (11) 

Node.NOTATION_NODE (12)

通過比較上面這些常量,可以很容易的确定節點的類型

為了確定跨浏覽器相容,最好還是将nodeType屬性與數字值比較

1、nodeName和nodeValue屬性

要了解節點的具體屬性,可以使用這兩個屬性,他們的值完全取決于節點的類型,在使用這兩個值之前,最好是像下面這樣先檢測一下節點的類型

2、節點關系

每個節點都有一個childNodes屬性,其中儲存着一個NodeList對象。NodeList是一種類數組對象,用于儲存一組有序的節點,可以通過為止來通路這些節點。要注意他不是Array的執行個體,他實際上是基于DOM結構動态執行查詢的結果,是以DOM結構的變化能夠自動反映在NodeList對象中,要通路NodeList中的節點可以通過方括号,也可以使用item()方法,另外也與其他節點存在某種關系。節點之間的關系構成了層次,而所有頁面标記則表現為一個以特定節點。

在前面介紹過,對arguments對象使用Array.prototype.slice()方法可以将其轉換為數組,對于NodeList也适用。

每一個節點都有一個parentNode屬性,該屬性指向文檔樹中的父節點。包含在childNodes清單中的所有節點都具有相同的父節點,是以他們的paternNode屬性都指向同一個節點。此外包含在childNodes清單中的每個節點互相之間都是同胞節點。通過使用清單中每個節點的previousSibling和nextSibling屬性,可以通路同一清單中的其他節點清單中第一個節點的previousSibling屬性值為null,而清單中最後一個節點的nextSlbling屬性的值同樣也是null

父節點的firstChild和lastChild屬性分别指向起childNodes清單中的第一個和最後一個節點。其中someNode.firstChild等于someNode.childNodes[0],而someNode.lastChild等于someNode.childNodes[someNode.childNodes.length - 1]

hasChildNodes()在節點包含一個或多個子節點的情況下傳回true

所有節點都有的最後一個屬性是ownerDocument,該屬性指向表示整個文檔的文檔節點,通過這個屬性,我們可以不必在節點層次中層層回溯到頂端,而是可以直接通路文檔節點

3、操作關系

appendChild(),用于向childNodes清單的末尾添加一個節點,相應的指針關系會更新,更新完成後傳回一個新增的節點。

如果傳入到appendChild()方法中的參數已經是文檔中的一部分,則他會從原來的位置轉移到新的位置,例如

insertBefore()把節點放在清單中某個特定的位置上。接受兩個參數:插入的節點和作為參考的節點。插入的節點會作為參考節點的前一個同胞節點,同時被傳回,如果參照節點是null,則和appendChild()相同

replaceChild()替換某個節點,接受兩個參數:插入的節點和要替換的節點。要替換的節點将由這個方法傳回并從文檔樹中移除。

removeChild()移除某個節點,接受一個參數即要移除的節點并傳回它。

4、其他方法

有兩個方法是所有類型的節點都有的:cloneNode()和normalize()

cloneNode()方法接受一個布爾值參數,表示是否執行深複制,參數為true時,執行深複制。也就是複制節點本身和整個子節點樹。參數為false時,執行淺複制即隻複制節點本身。複制後傳回的節點副本屬于文檔所有,但并沒有為他指定父節點。是以,這個節點的副本就成為了一個“孤兒”,除非通過appendChild()、insertBefore()或replaceChild()将他添加到文檔中,例如:

cloneNode()方法不會複制添加到DOM節點中的JavaScript屬性,例如事件處理程式等。

normalize()唯一的作用就是處理文檔中的文本節點,由于解析器的實作或者DOM操作等原因,可能會出現文本節點不包含文本,或者接連出現兩個文本節點的情況。當在某個節點上調用這個方法時,就會在該節點中查照上述兩種情況。如果找到了空文本節點,則删除它。如果找到相鄰的文本節點,則将它們合并為一個文本節點。

繼續閱讀