DOM ツリーは、ドキュメント内のすべてのノード (要素ノード、テキスト ノード、コメント ノードなど) で構成されるツリー構造です。DOM ツリーの解析と構築は、ブラウザによって実装される重要な機能です。 DOM ツリーはツリー構造であるため、ツリー構造をトラバースする関連メソッドを使用して DOM ツリーをトラバースできます。同時に、DOM2 の「Traversal」モジュールには 2 つの新しいタイプが用意されているため、DOM を簡単に実行できます。ツリーの事前注文トラバースが実装されました。
注: この記事の 5 つのメソッドはすべて DOM (深さ優先トラバーサル) の事前順序トラバーサル メソッドであり、要素タイプのみに焦点を当てています。
1. DOM1 の基本インターフェースを使用して、DOM ツリーを再帰的に走査します。
DOM1 は、基本タイプのノードにいくつかの API を提供し、これを通じていくつかの基本的な DOM 操作を完了できます。再帰を使用して DOM ツリーを走査するコードは比較的単純です。基本的な考え方は、最初に現在のノードを処理し、次に子ノードを左から右に再帰的に走査することです。 DOM ツリーを反復的に走査するための DOM1 の基本インターフェイス
最初の方法は、今回は DOM ツリーを反復的に走査するために使用します。 DOM ツリーを走査するための反復の使用は比較的複雑です。重要な点は、現在のノードが処理されるときに、ノードの最初の Element 子ノードがルート ノードとして使用されることです。次のサイクルの、現在のノードの他の子要素ノードを右から左の順序でスタックにプッシュします。現在のノードに Element 子ノードがない場合は、ルート ノードが取得できなくなるまで、スタックから Element ノードを次のサイクルのルート ノードとしてポップします。コードは次のとおりです:
/** * 使用递归的方式先序遍历DOM树 * @param node 根节点 */ function traversal(node){ //对node的处理 if(node && node.nodeType === 1){ console.log(node.tagName); } var i = 0, childNodes = node.childNodes,item; for(; i < childNodes.length ; i++){ item = childNodes[i]; if(item.nodeType === 1){ //递归先序遍历子节点 traversal(item); } } }
3. DOM 拡張要素トラバーサル API を使用して、DOM ツリーを再帰的に走査します
DOMElement Traversal API は、DOM トラバーサルを容易にするいくつかのインターフェイスを提供し、ノードの要素の子ノードを取得しやすくします。 「DOM 拡張: DOM API のさらなる強化 [概要 - 前編]」のセクション 2 では、DOM 拡張の Element Traversal API が紹介されています。コードは次のとおりです:
/** * 使用迭代的方式先序遍历DOM树 * @param node 根节点 */ function traversalIteration(node){ var array = [], i = 0,k = 0,elementCount = 0, len = 0, childNodes,item; while(node != null){ console.log(node.tagName); childNodes = node.childNodes; len = node.childNodes.length; elementCount = 0; if(len > 0){ for(i = 0; i < len; i++){ item = childNodes[i]; if(item.nodeType === 1){ elementCount++; node = item; break; } } for(k = len -1 ; k > i; k--){ item = childNodes[k]; if(item.nodeType == 1){ elementCount++; array.push(item); } } if(elementCount < 1){ node = array.pop(); } }else{ node = array.pop(); } } }
4. NodeIterator の使用
DOM2 の「Traversal」モジュールは、DOM ツリーの事前順序トラバーサルを簡単に実装するために使用できる NodeIterator タイプを提供します (「JavaScript Advanced Programming Third」の 12.3.1)。この型はセクションで紹介されており、ここでは次のようにコードを直接指定します:
/** * 使用DOM扩展的Traversal API提供的新的接口先序遍历DOM树 * @param node 根节点 */ function traversalUsingTraversalAPI(node){ if(node && node.nodeType === 1){ console.log(node.tagName); } var i = 0,len = node.childElementCount, child = node.firstElementChild; for(; i < len ; i++){ traversalUsingTraversalAPI(child); child = child.nextElementSibling; } }
5. TreeWalker の使用
TreeWalker 型は、セクションで紹介されている NodeIterator 型の拡張バージョンであると言えます。 『JavaScript Advanced Programming Third Edition』の 12.3.2 このタイプについては、次のようにコードもここに直接提供します:
/** * 使用DOM2的"Traversal"模块提供的NodeIterator先序遍历DOM树 * @param node 根节点 */ function traversalUsingNodeIterator(node){ var iterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT,null,false); var node = iterator.nextNode(); while(node != null){ console.log(node.tagName); node = iterator.nextNode(); } }
上記は、あなたと共有するために DOM ツリーを走査するための JavaScript メソッドです。みんなの学びに役立ててください。
DOM ツリーの事前順序トラバースの JavaScript メソッドに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。