1. 程式人生 > >【面向JS--DOM 遞迴API】

【面向JS--DOM 遞迴API】

1、NodeIterator

按照深度優先的順序,依次遍歷每個節點物件

深度優先: 優先遍歷一個節點的下級節點,只有下級節點遍歷完,才遍歷兄弟節點

如何使用: 2步:

1、建立NodeIterator物件:

var iterator = document.createNodeIterator( 
    root, whatToShow, filter,entityReferenceExpansion);

iterator就站在開始父節點上

用到的四個引數意義如下:

1、root:從樹中的哪個節點開始搜尋;
2、whatToShow:一個數值程式碼,代表哪些節點需要搜尋;
3、filter:NodeFilter物件,用來決定需要忽略哪些節點,不想使用它的話,可以留空(null);
4、entityReferenceExpansion:布林值,表示是否需要擴充套件實體引用;

whatToShow引數可以有下列這些常量或其組合的取值:

1、NodeFilter.SHOW_ALL:搜尋所有節點;
2、NodeFilter.SHOW_ELEMENT:搜尋元素節點;
3、NodeFilter.SHOW_ATRRIBUTE:搜尋特性節點;
4、NodeFilter.SHOW_TEXT:搜尋文字節點;
5、NodeFilter.SHOW_ENTITY_REFERENCE:搜尋實體引用節點;
6、NodeFilter.SHOW_ENTITY:搜尋實體節點;
7、NodeFilter.SHOW_PROCESSING_INSTRUCTION:搜尋PI節;
8、NodeFilter.SHOW_COMMENT:搜尋註釋節點;
9、NodeFilter.SHOW_DOCUMENT:搜尋文件節點;
10、NodeFilter.SHOW_DOCUMENT_TYPE:搜尋文件型別節點;
11、NodeFilter.SHOW_DOCUMENT_FRAGMENT:搜尋文件碎片節節;
12、NodeFilter.SHOW_NOTATION:搜尋記號節點;

最簡單的訪問所有節點的NodeIterator物件,可以使用下面的程式碼:

var iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL, null, false);

2、迴圈呼叫iterator,遍歷每個節點物件

返回當前節點,然後跳到下一個節點
    var currNode=iterator.nextNode()
倒退一步,返回當前節點
    var prevNode=iterator.previousNode()
迴圈條用
    while((node=iterator.nextNode())!=null){
        node//當前節點
    }

2、TreeWalker

可選擇跳轉方向的迭代器,基本功能和NodeIterator完全一樣

相同: 開始時都站在開始父元素上
不同: 添加了下面一些遍歷方法
     parentNode(): 跳到父節點
     firstChild(): 跳到第一個子節點
     lastChild(): 跳到最後一個子節點
     previousSibling(): 跳到前一個兄弟節點
     nextSibling(): 跳到後一個兄弟節點
<html>
<head>
<title>dom中的NodeIterator物件示例</title
>
<script> function makelist(){ var divnode = document.getElementById("div1"); var FILTER= new Object(); FILTER.acceptNode = function(node){ return (node.tagName == "P") ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; } var iterator = document.createTreeWalker(divnode, NodeFilter.SHOW_ELEMENT, FILTER, false); var oput = document.getElementById("textarea1"); var node = iterator.nextNode(); while(node){ oput.value += node.tagName +"\n"; node = iterator.nextNode(); } } </script> </head> <body> <div id="div1"> <p>你好<b>TreeWalker!</b></p> <ul> <li>列表項一</li> <li>列表項二</li> <li>列表項三</li> <li>列表項四</li> </ul> </div> <textarea id="textarea1" rows="10"></textarea><br /> <input type="button" value="生成列表" onclick="makelist()" /> </body> </html>