[轉(zhuǎn)帖]DOM 中 TreeWalker 對(duì)象的介紹
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
:DOM 中 TreeWalker 對(duì)象的介紹 DOM 中 TreeWalker 對(duì)象的介紹(翻譯)DOM 中 TreeWalker 對(duì)象的介紹(翻譯)原文地址:http://www.javascriptkit.com/dhtmltutors/treewalker.shtml TreeWalker對(duì)象是DOM2中提供的一個(gè)強(qiáng)大的工具,可以用來(lái)過(guò)濾文檔中的節(jié)點(diǎn),以便于產(chǎn)生自定義的節(jié)點(diǎn)集合。這聽(tīng)起來(lái)沒(méi)有什么太大的用處,但是如果你需要處理諸如遍歷DOM樹(shù)這樣的問(wèn)題時(shí),了解一下TreeWalker對(duì)象會(huì)帶來(lái)很大的幫助。你可能已經(jīng)很熟悉如何在Web頁(yè)面中查找具有某個(gè)CSS樣式名稱的節(jié)點(diǎn)集合,如何在XML文件中查找某個(gè)屬性為特定值的腳本寫(xiě)法。借助TreeWalker,僅需少量的工作也可以完成類似功能。在本文中,我將向你介紹TreeWalker對(duì)象,需要注意的是,TreeWalker對(duì)象已經(jīng)在Firefox/Opera8+中支持,但是IE6、IE7尚不支持。(注:Chrome、Safari這些基于WebKit內(nèi)核的瀏覽器也支持TreeWalker對(duì)象,IE9+也已經(jīng)支持) 另外,和TreeWalker關(guān)系緊密的另外一個(gè)對(duì)象NodeIterator,也會(huì)在本文檔中涵蓋。 document.createTreeWalker()方法對(duì)于某些人來(lái)說(shuō),TreeWalker對(duì)象開(kāi)起來(lái)有點(diǎn)兒神秘并且很復(fù)雜。實(shí)際上,要想使用TreeWalker對(duì)象,只需一個(gè)方法:document.createTreeWalker()。此方法有4個(gè)參數(shù),可以完成大部分的常見(jiàn)需求,例如在文檔中查找某種類型或者具有某個(gè)屬性的節(jié)點(diǎn)。對(duì)于此方法簡(jiǎn)單介紹如下:
來(lái)了解一下這4個(gè)參數(shù):
對(duì)于參數(shù)3,有以下可用的常量: NodeFilter常量
雖然有如此多的常量可以用來(lái)限制TreeWalker返回的節(jié)點(diǎn),但是在實(shí)際應(yīng)用中,可能常用的也就是其中的少數(shù)幾個(gè)常量。例如:NodeFilter.SHOW_ELEMENT返回所有的節(jié)點(diǎn)。 我們先從一個(gè)最基本的示例開(kāi)始:
在這個(gè)示例中,createTreeWalker方法的root參數(shù)為ID是contentarea的元素,讓TreeWalker對(duì)象以這個(gè)節(jié)點(diǎn)為根開(kāi)始進(jìn)行遍歷。第二個(gè)參數(shù)限制TreeWalker只遍歷根節(jié)點(diǎn)下的“元素”節(jié)點(diǎn)(例如忽略文本節(jié)點(diǎn)和注釋節(jié)點(diǎn))。第三個(gè)參數(shù)設(shè)置為null表示不需要引入自定義的過(guò)濾器。第四個(gè)參數(shù),用來(lái)控制實(shí)體引用是否被展開(kāi),這里我們?cè)O(shè)置為false。這段代碼執(zhí)行完畢之后,walker對(duì)象指向了包含DIV自己在內(nèi)的以及DIV下的所有子元素節(jié)點(diǎn)(P, SPAN, B)。 TreeWalker的遍歷方法使用document.createTreeWalker()方法創(chuàng)建了過(guò)濾后的節(jié)點(diǎn)列表,然后可以使用TreeWalker的遍歷方法對(duì)這些節(jié)點(diǎn)進(jìn)行遍歷:
不要把上述的這些方法和屬性和標(biāo)準(zhǔn)DOM元素的方法和屬性混淆,以上的方法只用在TreeWalker對(duì)象中,以實(shí)現(xiàn)遍歷過(guò)濾后的節(jié)點(diǎn)集合的能力。 還是使用上面的示例代碼,這次,我們加入一些代碼來(lái)遍歷TreeWalker返回的節(jié)點(diǎn)列表:
當(dāng)你使用TreeWalker的遍歷方法時(shí),TreeWalker不僅依次返回過(guò)濾后的節(jié)點(diǎn),同時(shí)它還移動(dòng)了當(dāng)前指向節(jié)點(diǎn)的指針,所以,在使用 再來(lái)一個(gè)示例加深一下對(duì)TreeWalker遍歷的理解:
在這個(gè)示例中,我們遍歷了根節(jié)點(diǎn)下所有的文本節(jié)點(diǎn)以獲取它完整的文本字符串。 在遍歷TreeWalker的返回結(jié)果時(shí),你也可以使用標(biāo)準(zhǔn)DOM元素的屬性和方法。因?yàn)門reeWalker的返回值不僅僅返回了過(guò)濾后的節(jié)點(diǎn),還包括這些節(jié)點(diǎn)在整個(gè)文檔中的關(guān)系。比如下面這個(gè)示例:
這個(gè)示例中,使用TreeWalker查找UL節(jié)點(diǎn)下的所有元素。你可能會(huì)誤以為 了解了如何遍歷TreeWalker的返回節(jié)點(diǎn)列表之后,下面將介紹如何自定義過(guò)濾器。還記得 在document.createTreeWalker()中使用過(guò)濾器TreeWalker對(duì)象的本質(zhì)是提供一種在文檔中過(guò)濾節(jié)點(diǎn)的能力。在前面的內(nèi)容中,我們已經(jīng)看到了可以使用NodeFilter的各種常量(例如NodeFilter.SHOW_ELEMENT)來(lái)完成最基本的過(guò)濾功能。但是在實(shí)際的場(chǎng)景中,這些常量可能還不足以支持你完成你的需求。這就需要用到
"filter"參數(shù)指向一個(gè)函數(shù),例如:
在上面的示例代碼中,我們定義了一個(gè)叫做myfilter的變量,該變量指向一個(gè)函數(shù),這個(gè)函數(shù)將僅保留DIV和IMG元素,而把其他的元素排除在外。作為過(guò)濾器的函數(shù)只接收一個(gè)參數(shù),就是TreeWalker在遍歷整個(gè)文檔時(shí)當(dāng)前所指向的節(jié)點(diǎn)。在過(guò)濾器函數(shù)中,你可以使用不同的返回值來(lái)實(shí)現(xiàn)接受、拒絕還是跳過(guò)當(dāng)前的節(jié)點(diǎn):
不言自明,F(xiàn)ILTER_ACCEPT就是表示接受這個(gè)節(jié)點(diǎn),將其包含到返回的結(jié)果中。但是FILTER_REJECT和FILTER_SKIP的含義可能會(huì)有些不那么明顯了。對(duì)于FILTER_REJECT,TreeWalker將拒絕當(dāng)前節(jié)點(diǎn)以及其所有的后代節(jié)點(diǎn),也就是說(shuō),當(dāng)你的過(guò)濾器函數(shù)返回FILTER_REJECT的時(shí)候,TreeWalker將不再遍歷該節(jié)點(diǎn)下的所有后代節(jié)點(diǎn)。如果你需要僅僅過(guò)濾掉當(dāng)前節(jié)點(diǎn),并且也希望TreeWalker繼續(xù)遍歷該節(jié)點(diǎn)下的所有后代節(jié)點(diǎn),那么請(qǐng)使用NodeFilter.FILTER_SKIP。例如對(duì)于上面的例子中,如果把 FILTER_SKIP 改為 FILTER_REJECT:
這樣的會(huì)導(dǎo)致返回的結(jié)果中可能并沒(méi)有包含文檔中全部的DIV和IMG元素,因?yàn)槿绻粋€(gè)IMG元素作為一個(gè)P元素的子元素的話,那么由于P元素被返回了FILTER_REJECT,那么P元素下的IMG元素也不會(huì)被TreeWalker遍歷。 示例:根據(jù)class屬性操作元素 在下面這個(gè)示例中,使用TreeWalker對(duì)象查找文檔中的所有class為blue的元素,并將其class設(shè)置為red:
組合使用NodeFilter常量在前面的內(nèi)容中我們已經(jīng)了解到NodeFilter提供了很多常量來(lái)讓我們獲取某種類型的節(jié)點(diǎn),這些常量也可以組合使用,例如:
只遍歷所有的元素節(jié)點(diǎn)和文本節(jié)點(diǎn):
這就是DOM2中提供的TreeWalker對(duì)象。請(qǐng)記住,并不是所有的瀏覽器都支持此對(duì)象。 該文章在 2024/7/17 14:32:44 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |