Document:createTreeWalker() 方法
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
创建器方法 Document.createTreeWalker() 返回新创建的 TreeWalker 对象。
语法
createTreeWalker(root)
createTreeWalker(root, whatToShow)
createTreeWalker(root, whatToShow, filter)
参数
root-
表示
TreeWalker对象的根节点的Node,为TreeWalker.currentNode的初始值。 whatToShow可选-
表示位掩码的
unsigned long,由NodeFilter的常属性组合而成。此参数便于筛选出特定类型的节点。其默认值为0xFFFFFFFF,表示NodeFilter.SHOW_ALL常数。常数 数值 描述 NodeFilter.SHOW_ALL0xFFFFFFFF显示所有节点。 NodeFilter.SHOW_ATTRIBUTE0x2显示 Attr节点。NodeFilter.SHOW_CDATA_SECTION0x8显示 CDATASection节点。NodeFilter.SHOW_COMMENT0x80显示 Comment节点。NodeFilter.SHOW_DOCUMENT0x100显示 Document节点。NodeFilter.SHOW_DOCUMENT_FRAGMENT0x400显示 DocumentFragment节点。NodeFilter.SHOW_DOCUMENT_TYPE0x200显示 DocumentType节点。NodeFilter.SHOW_ELEMENT0x1显示 Element节点。NodeFilter.SHOW_ENTITY已弃用0x20旧式参数,不再有效。 NodeFilter.SHOW_ENTITY_REFERENCE已弃用0x10旧式参数,不再有效。 NodeFilter.SHOW_NOTATION已弃用0x800旧式参数,不再有效。 NodeFilter.SHOW_PROCESSING_INSTRUCTION0x40显示 ProcessingInstruction节点。NodeFilter.SHOW_TEXT0x4显示 Text节点。备注: 由于任意
Attr节点的父节点恒为null,TreeWalker.nextNode()和TreeWalker.previousNode()永远不会返回Attr节点。遍历Attr节点请使用Element.attributes。 filter可选-
回调函数或含
acceptNode()方法的对象,其返回值为NodeFilter.FILTER_ACCEPT、NodeFilter.FILTER_REJECT或NodeFilter.FILTER_SKIP。对于以root为根节点的子树中被whatToShow标志所接受的任意节点,将调用此函数或方法决定是否在迭代节点列表中包含此节点:- 若返回值为
NodeFilter.FILTER_ACCEPT,则包含此节点。 - 若返回值为
NodeFilter.FILTER_REJECT,则不包含以此节点为根的子树中的任意节点。 - 若返回值为
NodeFilter.FILTER_SKIP,则不包含此节点。
- 若返回值为
返回值
新的 TreeWalker 对象。
示例
>使用 whatToShow
此示例使用 whatToShow 将文本内容转换为大写。注意到 #root 后代的文本节点虽然并非 #root 元素的子节点,但也将被遍历。
HTML
<div id="root">
此节点为 Text 节点。<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>此文本未被转义。<span class="escape">但此文本被转义。</span></div>
<div class="escape">此文本被转义。</div>
<div class="no-escape">此文本未被转义。</div>
</div>
<hr />
<div class="escape">
<div>此文本被转义。<span class="no-escape">但此文本未被转义。</span></div>
<div class="no-escape">此文本未被转义。</div>
</div>
<hr />
<div class="no-escape">
<div>此文本未被转义。</div>
<div class="escape">此文本未被转义。</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)) {
// 排除仅含空白符的文本节点
node.data = encodeURI(node.data.replace(/\s+/g, " "));
}
}
}
结果
规范
| Specification |
|---|
| DOM> # dom-document-createtreewalker> |
浏览器兼容性
Loading…
参见
TreeWalker——相关接口