本篇文章給大家分享的是有關(guān)JavaScript 中怎么利用DOM實(shí)現(xiàn)文檔遍歷,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),雅安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:雅安等地區(qū)。雅安做網(wǎng)站價(jià)格咨詢:18982081108
訪問元素,你應(yīng)該明白它是該文件的document元素,那你就可以使用document的documentElement屬性:
var oHtml=document.documentElement;//可以直接訪問元素 alert("節(jié)點(diǎn)名稱 : "+oHtml.nodeName);//節(jié)點(diǎn)名稱 alert("節(jié)點(diǎn)類型 : "+oHtml.nodeType);//節(jié)點(diǎn)類型為 1
獲取
和 元素:var oHead=oHtml.firstChild;//HEAD節(jié)點(diǎn) var oBody=oHtml.lastChild;//BODY節(jié)點(diǎn)
也可以通過childNodes屬性,獲取
和 元素:var oHead=oHtml.childNodes.item(0);//HEAD節(jié)點(diǎn) //var oHead=oHtml.childNodes[0];//簡寫,也有同樣的結(jié)果是HEAD節(jié)點(diǎn) var oBody=oHtml.childNodes.item(1);//BODY節(jié)點(diǎn) //var oBody=oHtml.childNodes.item(1);//簡寫,也有同樣的結(jié)果是BODY節(jié)點(diǎn)
注意:方括號標(biāo)記其實(shí)是NodeList在javascript中的簡便實(shí)現(xiàn)。實(shí)際上正式的從childNodes列表中獲取子節(jié)點(diǎn)的方法是使用item()方法:HTML DOM 中的專有屬性 document.body ,它常用于直接訪問元素:
var oBody=document.body;
既然我們都知道了以上節(jié)點(diǎn)對象的獲取方式,那我們用oHtml,oHead,oBody 這三個(gè)變量來確定一下它們之間的關(guān)系:
alert(oHead.parentNode==oHtml);//HEAD節(jié)點(diǎn)的父節(jié)點(diǎn)是BODY節(jié)點(diǎn),返回 true alert(oBody.parentNode==oHtml);//BODY節(jié)點(diǎn)的父節(jié)點(diǎn)是BODY節(jié)點(diǎn),返回 true alert(oBody.previousSibling==oHead);//BODY節(jié)點(diǎn)的上一個(gè)兄弟節(jié)點(diǎn)是HEAD節(jié)點(diǎn) ,返回 true alert(oHead.nextSibling==oBody);//HEAD節(jié)點(diǎn)的下一個(gè)兄弟節(jié)點(diǎn)是BODY節(jié)點(diǎn),返回 true alert(oHead.ownerDocument==document); //返回一個(gè)節(jié)點(diǎn)的根元素(Document),HEAD節(jié)點(diǎn)是否指向該文檔,返回 true
通過上面的學(xué)習(xí)我們已經(jīng)了解遍歷節(jié)點(diǎn)的最基本的方式, 也學(xué)會(huì)了如何找到某一個(gè)節(jié)點(diǎn)的兄弟節(jié)點(diǎn)及它的子節(jié)點(diǎn)。
復(fù)雜的節(jié)點(diǎn)遍歷
在上面的學(xué)習(xí)中我們好像沒有遇到過大的阻礙,下面我們以一個(gè)“導(dǎo)航條”為實(shí)例:
我的導(dǎo)航條
首先我想把看一下我的導(dǎo)航條下有多少個(gè)子節(jié)點(diǎn)。我***想到的是前面我學(xué)過的查找元素的2種方法:
◆getElementById() # 通過ID屬性查找元素
該方法將返回一個(gè)與那個(gè)有著給定id屬性值的元素節(jié)點(diǎn)相對應(yīng)的對象。
◆getElementsByTagName() # 通過標(biāo)簽名稱查找元素
該方法返回一個(gè)對象數(shù)組,每個(gè)對象分別對應(yīng)著文檔里有著給定標(biāo)簽的一個(gè)元素。
節(jié)點(diǎn)遍歷
那我們接下來,測一下是否是我們想要的東西:
先看一下***個(gè)方法queryElementsId()好像我們在IE中沒有發(fā)現(xiàn)有什么問題,那我們在Firefox中看一下是否也是我們想要的結(jié)果。
這時(shí),問題出現(xiàn)了,不同的瀏覽器在判斷何為Text節(jié)點(diǎn)上存在著一些差異,例如在A級瀏覽器中的FF和IE就有很大的差異,F(xiàn)ireFox會(huì)把元素之間的空白、換行、tab都是Text節(jié)點(diǎn),IE下會(huì)把空白全部忽略掉,只有內(nèi)聯(lián)元素(如em,span)后的換行、空格、tab會(huì)被認(rèn)為是一個(gè)Text。既然遇到了問題那我們就得解決問題,問題的根源我們也知道了,那相應(yīng)的解決方案就好做了。
方法一:
方法二:
方法三:推薦
好了,我們在驗(yàn)證一下,#Text節(jié)點(diǎn)問題是否處理掉了。那我們就用方法3 中removeWhitespace(nav)方法來處理queryElementsId()方法中的#Text節(jié)點(diǎn)問題。
正如看到的結(jié)果,IE和FireFox中都沒有問題了。
一個(gè)比較通用的方法:
用元素節(jié)點(diǎn)的DOM屬性遍歷DOM樹
寫到這里,既然標(biāo)準(zhǔn)的previousSibling,nextSibling,firstChild,lastChild,parentNode遍歷方法有瀏覽器不兼容問題。我上面的解決方案是去掉遍歷元素的相關(guān)空的#Text節(jié)點(diǎn),是一個(gè)好的解決方案,但是使用起來不方便,我們何不自己寫一些遍歷節(jié)點(diǎn)的方法來代替標(biāo)準(zhǔn)的的previousSibling,nextSibling,firstChild,lastChild,parentNode。
我們的思路是利用元素是nodeType屬性來判斷元素是節(jié)點(diǎn)類型中那種節(jié)點(diǎn)類型,在DOM節(jié)點(diǎn)中我最常用的是元素節(jié)點(diǎn),文本節(jié)點(diǎn),屬性節(jié)點(diǎn),對應(yīng)的類型值是元素節(jié)點(diǎn)nodeType=1 or ELEMENT_NODE, 文本節(jié)點(diǎn) nodeType=2 or ATTRIBUTE_NODE,屬性節(jié)點(diǎn) 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;
以上就是JavaScript 中怎么利用DOM實(shí)現(xiàn)文檔遍歷,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。