语法
js
createTreeWalker(root)
createTreeWalker(root, whatToShow)
createTreeWalker(root, whatToShow, filter)
参数
根-
一个
Node,代表TreeWalker对象的根,它是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
html
<div id="root">
This is a text node.
<span>And this is a <code>span</code> element.</span>
</div>
CSS
css
span {
background-color: aqua;
}
JavaScript
js
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
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
css
.escape {
border: dashed;
}
.no-escape {
border: solid;
}
JavaScript
js
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:相关接口