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

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、池州ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的池州網(wǎng)站制作公司
訪問元素,你應(yī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é)點
注意:方括號標(biāo)記其實是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
通過上面的學(xué)習(xí)我們已經(jīng)了解遍歷節(jié)點的最基本的方式, 也學(xué)會了如何找到某一個節(jié)點的兄弟節(jié)點及它的子節(jié)點。
#p#
復(fù)雜的節(jié)點遍歷
在上面的學(xué)習(xí)中我們好像沒有遇到過大的阻礙,下面我們以一個“導(dǎo)航條”為實例:
首先我想把看一下我的導(dǎo)航條下有多少個子節(jié)點。我***想到的是前面我學(xué)過的查找元素的2種方法:
◆getElementById() # 通過ID屬性查找元素
該方法將返回一個與那個有著給定id屬性值的元素節(jié)點相對應(yīng)的對象。
◆getElementsByTagName() # 通過標(biāo)簽名稱查找元素
該方法返回一個對象數(shù)組,每個對象分別對應(yīng)著文檔里有著給定標(biāo)簽的一個元素。
節(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會被認(rèn)為是一個Text。既然遇到了問題那我們就得解決問題,問題的根源我們也知道了,那相應(yīng)的解決方案就好做了。
方法一:
方法二:
方法三:推薦
好了,我們在驗證一下,#Text節(jié)點問題是否處理掉了。那我們就用方法3 中removeWhitespace(nav)方法來處理queryElementsId()方法中的#Text節(jié)點問題。
正如看到的結(jié)果,IE和FireFox中都沒有問題了。
#p#
一個比較通用的方法:
用元素節(jié)點的DOM屬性遍歷DOM樹
寫到這里,既然標(biāo)準(zhǔn)的previousSibling,nextSibling,firstChild,lastChild,parentNode遍歷方法有瀏覽器不兼容問題。我上面的解決方案是去掉遍歷元素的相關(guān)空的#Text節(jié)點,是一個好的解決方案,但是使用起來不方便,我們何不自己寫一些遍歷節(jié)點的方法來代替標(biāo)準(zhǔn)的的previousSibling,nextSibling,firstChild,lastChild,parentNode。
我們的思路是利用元素是nodeType屬性來判斷元素是節(jié)點類型中那種節(jié)點類型,在DOM節(jié)點中我最常用的是元素節(jié)點,文本節(jié)點,屬性節(jié)點,對應(yīng)的類型值是元素節(jié)點nodeType=1 or ELEMENT_NODE, 文本節(jié)點 nodeType=2 or ATTRIBUTE_NODE,屬性節(jié)點 nodeType=3 or TEXT_NODE,但是IE中并不支持命名常量,那就用數(shù)值吧,再配合標(biāo)準(zhǔn)的遍歷屬性。完全可以自己生產(chǎn)一些輔助函數(shù)來取代標(biāo)準(zhǔn)的遍歷方式。以下一系列的輔助函數(shù)可以幫助您,他們能取代標(biāo)準(zhǔn)的previousSibling,nextSibling,firstChild,lastChild,parentNode;
原文鏈接:http://cssrainbow.cn/tutorials/javascript/565.html
【編輯推薦】
- JavaScript DOM特性與應(yīng)用詳解
- JavaScript DOM修改文檔樹方法實例
- JavaScript DOM實戰(zhàn):創(chuàng)建和克隆元素
網(wǎng)頁標(biāo)題:JavaScriptDOM文檔遍歷實戰(zhàn)
本文地址:http://www.dlmjj.cn/article/coeiijc.html


咨詢
建站咨詢
