新聞中心
在介紹了《JavaScript DOM修改文檔樹方法實例》與《JavaScript DOM實戰(zhàn):創(chuàng)建和克隆元素》,本文將介紹JavaScript DOM文檔遍歷的詳細知識,我們先從HTML頁面最基本的組成元素討論起:

我們提供的服務有:成都網(wǎng)站設計、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、池州ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的池州網(wǎng)站制作公司
訪問元素,你應該明白它是該文件的document元素,那你就可以使用document的documentElement屬性:
- var oHtml=document.documentElement;//可以直接訪問元素
- alert("節(jié)點名稱 : "+oHtml.nodeName);//節(jié)點名稱
- alert("節(jié)點類型 : "+oHtml.nodeType);//節(jié)點類型為 1
獲取
和 元素:
- var oHead=oHtml.firstChild;//HEAD節(jié)點
- var oBody=oHtml.lastChild;//BODY節(jié)點
也可以通過childNodes屬性,獲取
和 元素:
- var oHead=oHtml.childNodes.item(0);//HEAD節(jié)點
- //var oHead=oHtml.childNodes[0];//簡寫,也有同樣的結(jié)果是HEAD節(jié)點
- var oBody=oHtml.childNodes.item(1);//BODY節(jié)點
- //var oBody=oHtml.childNodes.item(1);//簡寫,也有同樣的結(jié)果是BODY節(jié)點
注意:方括號標記其實是NodeList在javascript中的簡便實現(xiàn)。實際上正式的從childNodes列表中獲取子節(jié)點的方法是使用item()方法:HTML DOM 中的專有屬性 document.body ,它常用于直接訪問元素:
- var oBody=document.body;
既然我們都知道了以上節(jié)點對象的獲取方式,那我們用oHtml,oHead,oBody 這三個變量來確定一下它們之間的關(guān)系:
- alert(oHead.parentNode==oHtml);//HEAD節(jié)點的父節(jié)點是BODY節(jié)點,返回 true
- alert(oBody.parentNode==oHtml);//BODY節(jié)點的父節(jié)點是BODY節(jié)點,返回 true
- alert(oBody.previousSibling==oHead);//BODY節(jié)點的上一個兄弟節(jié)點是HEAD節(jié)點 ,返回 true
- alert(oHead.nextSibling==oBody);//HEAD節(jié)點的下一個兄弟節(jié)點是BODY節(jié)點,返回 true
- alert(oHead.ownerDocument==document); //返回一個節(jié)點的根元素(Document),HEAD節(jié)點是否指向該文檔,返回 true
通過上面的學習我們已經(jīng)了解遍歷節(jié)點的最基本的方式, 也學會了如何找到某一個節(jié)點的兄弟節(jié)點及它的子節(jié)點。
#p#
復雜的節(jié)點遍歷
在上面的學習中我們好像沒有遇到過大的阻礙,下面我們以一個“導航條”為實例:
首先我想把看一下我的導航條下有多少個子節(jié)點。我***想到的是前面我學過的查找元素的2種方法:
◆getElementById() # 通過ID屬性查找元素
該方法將返回一個與那個有著給定id屬性值的元素節(jié)點相對應的對象。
◆getElementsByTagName() # 通過標簽名稱查找元素
該方法返回一個對象數(shù)組,每個對象分別對應著文檔里有著給定標簽的一個元素。
節(jié)點遍歷
那我們接下來,測一下是否是我們想要的東西:
先看一下***個方法queryElementsId()好像我們在IE中沒有發(fā)現(xiàn)有什么問題,那我們在Firefox中看一下是否也是我們想要的結(jié)果。
這時,問題出現(xiàn)了,不同的瀏覽器在判斷何為Text節(jié)點上存在著一些差異,例如在A級瀏覽器中的FF和IE就有很大的差異,F(xiàn)ireFox會把元素之間的空白、換行、tab都是Text節(jié)點,IE下會把空白全部忽略掉,只有內(nèi)聯(lián)元素(如em,span)后的換行、空格、tab會被認為是一個Text。既然遇到了問題那我們就得解決問題,問題的根源我們也知道了,那相應的解決方案就好做了。
方法一:
方法二:
方法三:推薦
好了,我們在驗證一下,#Text節(jié)點問題是否處理掉了。那我們就用方法3 中removeWhitespace(nav)方法來處理queryElementsId()方法中的#Text節(jié)點問題。
正如看到的結(jié)果,IE和FireFox中都沒有問題了。
#p#
一個比較通用的方法:
用元素節(jié)點的DOM屬性遍歷DOM樹
寫到這里,既然標準的previousSibling,nextSibling,firstChild,lastChild,parentNode遍歷方法有瀏覽器不兼容問題。我上面的解決方案是去掉遍歷元素的相關(guān)空的#Text節(jié)點,是一個好的解決方案,但是使用起來不方便,我們何不自己寫一些遍歷節(jié)點的方法來代替標準的的previousSibling,nextSibling,firstChild,lastChild,parentNode。
我們的思路是利用元素是nodeType屬性來判斷元素是節(jié)點類型中那種節(jié)點類型,在DOM節(jié)點中我最常用的是元素節(jié)點,文本節(jié)點,屬性節(jié)點,對應的類型值是元素節(jié)點nodeType=1 or ELEMENT_NODE, 文本節(jié)點 nodeType=2 or ATTRIBUTE_NODE,屬性節(jié)點 nodeType=3 or TEXT_NODE,但是IE中并不支持命名常量,那就用數(shù)值吧,再配合標準的遍歷屬性。完全可以自己生產(chǎn)一些輔助函數(shù)來取代標準的遍歷方式。以下一系列的輔助函數(shù)可以幫助您,他們能取代標準的previousSibling,nextSibling,firstChild,lastChild,parentNode;
原文鏈接:http://cssrainbow.cn/tutorials/javascript/565.html
【編輯推薦】
- JavaScript DOM特性與應用詳解
- JavaScript DOM修改文檔樹方法實例
- JavaScript DOM實戰(zhàn):創(chuàng)建和克隆元素
分享文章:JavaScriptDOM文檔遍歷實戰(zhàn)
文章出自:http://www.5511xx.com/article/coeiijc.html


咨詢
建站咨詢
