Document: createTreeWalker() メソッド
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
Document.createTreeWalker() 作成メソッドは、新しく作成された TreeWalker オブジェクトを返します。
構文
createTreeWalker(root)
createTreeWalker(root, whatToShow)
createTreeWalker(root, whatToShow, filter)
引数
root-
Nodeで、TreeWalker.currentNodeの初期値であるTreeWalkerオブジェクトのルートを表します。 whatToShow省略可-
unsigned longで、NodeFilterの定数プロパティを組み合わせて作成したビットマスクを表します。特定の型のノードをフィルタリングする便利な方法です。既定値は0xFFFFFFFFで、これはNodeFilter.SHOW_ALL定数を表します。定数 数値 説明 NodeFilter.SHOW_ALL0xFFFFFFFFすべてのノードを出力します。 NodeFilter.SHOW_ATTRIBUTE0x2Attrノードを出力します。NodeFilter.SHOW_CDATA_SECTION0x8CDATASectionノードを出力します。NodeFilter.SHOW_COMMENT0x80Commentノードを出力します。NodeFilter.SHOW_DOCUMENT0x100Documentノードを出力します。NodeFilter.SHOW_DOCUMENT_FRAGMENT0x400DocumentFragmentノードを出力します。NodeFilter.SHOW_DOCUMENT_TYPE0x200DocumentTypeノードを出力します。NodeFilter.SHOW_ELEMENT0x1Elementノードを出力します。NodeFilter.SHOW_ENTITY0x20古いものであり、効果はありません。 NodeFilter.SHOW_ENTITY_REFERENCE0x10古いものであり、効果はありません。 NodeFilter.SHOW_NOTATION0x800古いものであり、効果はありません。 NodeFilter.SHOW_PROCESSING_INSTRUCTION0x40ProcessingInstructionノードを出力します。NodeFilter.SHOW_TEXT0x4Textノードを出力します。メモ:
Attrノードの親は常にnullであるため、TreeWalker.nextNode()やTreeWalker.previousNode()がAttrノードを返すことはありません。Attrノードを走査するには、Element.attributesを使用してください。 filter省略可-
コールバック関数または
acceptNode()メソッドを持つオブジェクトで、NodeFilter.FILTER_ACCEPT、NodeFilter.FILTER_REJECT、NodeFilter.FILTER_SKIPのいずれかを返します。この関数またはメソッドは、whatToShowフラグによって含まれるものとして受け入れられたrootを基点とするサブツリーの各ノードに対して呼び出され、反復可能オブジェクトのリストに含めるかどうかを決定します。- 返値が
NodeFilter.FILTER_ACCEPTの場合、このノードが含まれます。 - 返値が
NodeFilter.FILTER_REJECTの場合、このノードの配下のサブツリーにあるすべてのノードが含まれません。 - 返値が
NodeFilter.FILTER_SKIPの場合、このノードは含まれません。
- 返値が
返値
新しい TreeWalker オブジェクトです。
例
>whatToShow の使用
この例では、whatToShow を使用してテキストコンテンツを大文字に変換しています。なお、#root 要素の子ノードではないにもかかわらず、#root 要素の子孫のテキストノードも走査されます。
HTML
<div id="root">
これはテキストノードです。
<span>そして、これは <code>span</code> 要素です。</span>
</div>
CSS
span {
background-color: aqua;
}
JavaScript
const treeWalker = document.createTreeWalker(
document.querySelector("#root"),
NodeFilter.SHOW_TEXT,
);
while (treeWalker.nextNode()) {
const node = treeWalker.currentNode;
node.data = node.data.toUpperCase();
}
結果
filter の使用
この例では filter を使用してテキストコンテンツをエスケープします。テキストノードが .escape 要素の子孫であり、かつ .no-escape 要素の子孫でない場合、そのコンテンツは encodeURI() を使用してエスケープされます。
HTML
<div>
<div>
This is not escaped. <span class="escape">But this is escaped.</span>
</div>
<div class="escape">This is escaped.</div>
<div class="no-escape">This is not escaped.</div>
</div>
<hr />
<div class="escape">
<div>
This is escaped. <span class="no-escape">But this is not escaped.</span>
</div>
<div class="no-escape">This is not escaped.</div>
</div>
<hr />
<div class="no-escape">
<div>This is not escaped.</div>
<div class="escape">This is not escaped.</div>
</div>
CSS
.escape {
border: dashed;
}
.no-escape {
border: solid;
}
JavaScript
const treeWalker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT,
(node) =>
node.classList.contains("no-escape")
? NodeFilter.FILTER_REJECT
: node.closest(".escape")
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_SKIP,
);
while (treeWalker.nextNode()) {
for (const node of treeWalker.currentNode.childNodes) {
if (node.nodeType === Node.TEXT_NODE && /\S/.test(node.data)) {
// Exclude whitespace-only text nodes
node.data = encodeURI(node.data.replace(/\s+/g, " "));
}
}
}
結果
仕様書
| 仕様書 |
|---|
| DOM> # dom-document-createtreewalker> |
ブラウザーの互換性
関連情報
TreeWalker: 関連インターフェイス