創(chuàng)新互聯(lián)建站專注于中大型企業(yè)的網(wǎng)站建設(shè)、網(wǎng)站制作和網(wǎng)站改版、網(wǎng)站營銷服務,追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶數(shù)千家,服務滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!
DOM(文檔隊形模型)是針對HTML和XML文檔的一個API(應用程序編程接口)。DOM描繪了一個層次化的節(jié)點樹,允許開發(fā)人員添加,移除和修改頁面的一部分。DOM可以講任何HTML和XML文檔描繪成一個有多層次節(jié)點構(gòu)成的結(jié)構(gòu)。節(jié)點分為幾種不同的類型,每種類型分別表示文檔中不同的信息。每個節(jié)點都擁有各自的特點、數(shù)據(jù)和方法,另外也與其他節(jié)點存在某種關(guān)系。節(jié)點之間的關(guān)系構(gòu)成了層次,而所有頁面標記則表現(xiàn)為一個以特定節(jié)點為根節(jié)點的樹形結(jié)構(gòu)。總共有12種節(jié)點類型,這些類型都繼承自一個基類型-Node類型
Node類型
DOM1級定義了一個Node接口,Javascript中的所有節(jié)點類型都繼承自Node類型,因此所有節(jié)點類型都共享著相同的基本屬性和方法,每個節(jié)點都有一個nodeType屬性,用于表明節(jié)點的類型。節(jié)點類型由在Node類型中定義的下列12個數(shù)值常量來表示,任何節(jié)點類型必居其一:
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)
通過比較上面這些常量,可以很容易的確定節(jié)點的類型
1 if(someNode.nodeType == Node.ELEMENT_NODE){ //在IE中無效2 alert("Node is an element");3 }
為了確保跨瀏覽器兼容,最好還是將nodeType屬性與數(shù)字值比較
1 if(someNode.nodeType == 1){ 2 alert("Node is an element");3 }
1、nodeName和nodeValue屬性
要了解節(jié)點的具體屬性,可以使用這兩個屬性,他們的值完全取決于節(jié)點的類型,在使用這兩個值之前,最好是像下面這樣先檢測一下節(jié)點的類型
1 if(someNode.nodeType == 1){2 value = someNode.nodeName; //nodeName的值是元素的標簽名3 }
2、節(jié)點關(guān)系
每個節(jié)點都有一個childNodes屬性,其中保存著一個NodeList對象。NodeList是一種類數(shù)組對象,用于保存一組有序的節(jié)點,可以通過為止來訪問這些節(jié)點。要注意他不是Array的實例,他實際上是基于DOM結(jié)構(gòu)動態(tài)執(zhí)行查詢的結(jié)果,因此DOM結(jié)構(gòu)的變化能夠自動反映在NodeList對象中,要訪問NodeList中的節(jié)點可以通過方括號,也可以使用item()方法,另外也與其他節(jié)點存在某種關(guān)系。節(jié)點之間的關(guān)系構(gòu)成了層次,而所有頁面標記則表現(xiàn)為一個以特定節(jié)點。
1 var fitstChild = sonmeNode.childNodes[0];2 var secondChild = someNode.childNodes.item(1);3 var count = someNode.childNodes.length;
在前面介紹過,對arguments對象使用Array.prototype.slice()方法可以將其轉(zhuǎn)換為數(shù)組,對于NodeList也適用。
1 //在IE8及之前版本無效 2 var arrayOfNodes = Array.prototype.alice.call(someNode.childNodes,0); 3 4 //兼容所有瀏覽器 5 function converToArray(nodes){ 6 var array = null; 7 try{ 8 array = Array.prototype.slice.call(nodes,0); //針對非IE瀏覽器 9 }catch(ex){10 array = new Array();11 for(var i=0,len = nodes.length;i < len; i++){12 array.push(nodes[i]);13 }14 }15 return array;16 }
每一個節(jié)點都有一個parentNode屬性,該屬性指向文檔樹中的父節(jié)點。包含在childNodes列表中的所有節(jié)點都具有相同的父節(jié)點,因此他們的paternNode屬性都指向同一個節(jié)點。此外包含在childNodes列表中的每個節(jié)點相互之間都是同胞節(jié)點。通過使用列表中每個節(jié)點的previousSibling和nextSibling屬性,可以訪問同一列表中的其他節(jié)點列表中第一個節(jié)點的previousSibling屬性值為null,而列表中最后一個節(jié)點的nextSlbling屬性的值同樣也是null
父節(jié)點的firstChild和lastChild屬性分別指向起childNodes列表中的第一個和最后一個節(jié)點。其中someNode.firstChild等于someNode.childNodes[0],而someNode.lastChild等于someNode.childNodes[someNode.childNodes.length - 1]
hasChildNodes()在節(jié)點包含一個或多個子節(jié)點的情況下返回true
所有節(jié)點都有的最后一個屬性是ownerDocument,該屬性指向表示整個文檔的文檔節(jié)點,通過這個屬性,我們可以不必在節(jié)點層次中層層回溯到頂端,而是可以直接訪問文檔節(jié)點
3、操作關(guān)系
appendChild(),用于向childNodes列表的末尾添加一個節(jié)點,相應的指針關(guān)系會更新,更新完成后返回一個新增的節(jié)點。
1 var returnNode = someNode.appendChild(newNode);2 console.log(returnNode = someNode.firstChild); //true3 console.log(returnNode = newNode); //true
如果傳入到appendChild()方法中的參數(shù)已經(jīng)是文檔中的一部分,則他會從原來的位置轉(zhuǎn)移到新的位置,例如
1 var returnNode = someNode.appendChild(someNode.firstChild);2 console.log(returnNode = sonmeNode.firstChild); //false3 console.log(returnNode = someNode.lastChild); //true
insertBefore()把節(jié)點放在列表中某個特定的位置上。接受兩個參數(shù):插入的節(jié)點和作為參考的節(jié)點。插入的節(jié)點會作為參考節(jié)點的前一個同胞節(jié)點,同時被返回,如果參照節(jié)點是null,則和appendChild()相同
1 //插入后成為第一個節(jié)點2 returnNode = someNode.insertBefore(newNode,someNode.childNodes[0]);3 //插入后成為最后一個節(jié)點4 returnNode = someNode.insertBefore(newNode,someNode.lastChild);5 //插入到最后一個節(jié)點的前面6 returnNode = someNode.insertBefore(newNode,someNode.childNodes[someNode.childNodes.length - 1]);
replaceChild()替換某個節(jié)點,接受兩個參數(shù):插入的節(jié)點和要替換的節(jié)點。要替換的節(jié)點將由這個方法返回并從文檔樹中移除。
1 //替換第一個子節(jié)點2 var returnNode = replaceChild(newNode,someNode.firstChild);
removeChild()移除某個節(jié)點,接受一個參數(shù)即要移除的節(jié)點并返回它。
1 //移除第一個子節(jié)點2 var returnNode = removeChild(someNode.childNodes[0]);
4、其他方法
有兩個方法是所有類型的節(jié)點都有的:cloneNode()和normalize()
cloneNode()方法接受一個布爾值參數(shù),表示是否執(zhí)行深復制,參數(shù)為true時,執(zhí)行深復制。也就是復制節(jié)點本身和整個子節(jié)點樹。參數(shù)為false時,執(zhí)行淺復制即只復制節(jié)點本身。復制后返回的節(jié)點副本屬于文檔所有,但并沒有為他指定父節(jié)點。因此,這個節(jié)點的副本就成為了一個“孤兒”,除非通過appendChild()、insertBefore()或replaceChild()將他添加到文檔中,例如:
1 <ul> 2 <li></li> 3 <li></li> 4 <li></li> 5 </ul> 6 7 //如果我們已經(jīng)將<ul>元素的引用保存在了myList中, 8 9 var deepList = myList.cloneNode(true);10 console.log(deepList.childNodes.length); //311 12 var shallowList = myList.cloneNode(false);13 concole.log(shallow.childNodes.length); //0
cloneNode()方法不會復制添加到DOM節(jié)點中的JavaScript屬性,例如事件處理程序等。
normalize()唯一的作用就是處理文檔中的文本節(jié)點,由于解析器的實現(xiàn)或者DOM操作等原因,可能會出現(xiàn)文本節(jié)點不包含文本,或者接連出現(xiàn)兩個文本節(jié)點的情況。當在某個節(jié)點上調(diào)用這個方法時,就會在該節(jié)點中查照上述兩種情況。如果找到了空文本節(jié)點,則刪除它。如果找到相鄰的文本節(jié)點,則將它們合并為一個文本節(jié)點。
網(wǎng)站名稱:DOM-Node類型
文章起源:http://muchs.cn/article16/gdojgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、面包屑導航、服務器托管、外貿(mào)建站、小程序開發(fā)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)