最近我开始利用空闲时间开发一个新的 Chrome 扩展,在研究如何处理一些功能的过程中,我开始发现 JS 在处理 DOM 方面有越来越多的功能。页。
考虑到绝大多数使用 JS 的人仅通过框架来使用它,这将成为一系列短文的一个有趣主题,让人们更多地了解他们所依赖的框架的底层技术实际使用。
我们都经历过这样的情况 — 您需要在 DOM 中查找特定元素,但 querySelector 和 getElementsBy* 并不能完全解决这个问题。也许您需要查找包含特定短语的所有文本节点,或者您想要遍历符合某些条件的元素,同时跳过其他条件。输入 TreeWalker - 一个强大但经常被忽视的 DOM 遍历 API。
什么是树行者?
TreeWalker 是一个 DOM 接口,可让您高效地遍历和过滤 DOM 节点。将其视为 querySelector 等方法的更强大、更灵活的替代方法。 querySelector 为您提供与 CSS 选择器匹配的元素,而 TreeWalker 可以让您:
- 在任意方向上导航 DOM 树(向前、向后、向上、向下)
- 根据自定义条件过滤节点
- 完全跳过树的某些部分
- 直接访问文本节点(querySelector 无法做到)
创建树行者
让我们从一个基本示例开始:
const walker = document.createTreeWalker(
document.body, // Root node to start traversal
NodeFilter.SHOW_TEXT, // Only show text nodes
{
acceptNode: function(node) {
// Only accept text nodes that aren't empty
return node.textContent.trim().length > 0
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_REJECT;
}
}
);
这三个参数是:
- 根节点——从哪里开始遍历
- 要显示什么类型的节点(文本、元素、注释等)
- 决定接受或拒绝哪些节点的过滤函数
现实世界的例子
1. 查找和替换文本
这是您实际使用的东西 - 查找和替换文本,同时保留 HTML 结构。
function replaceText(root, search, replace) {
const walker = document.createTreeWalker(
root,
NodeFilter.SHOW_TEXT,
{
acceptNode: function(node) {
return node.textContent.includes(search)
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_REJECT;
}
}
);
let node;
while (node = walker.nextNode()) {
node.textContent = node.textContent.replace(search, replace);
}
}
// Usage
replaceText(document.body, 'old text', 'new text');
这比使用innerHTML 高效得多,并且不会破坏事件侦听器或表单输入值。
2. 自定义DOM查询
需要查找匹配复杂条件的元素? TreeWalker 可以满足您的需求。让我们构建一些更复杂的东西 - 假设您需要找到所有 包含特定文本的元素,但前提是它们位于 内具有特定类的元素,并忽略
以上是TreeWalker:DOM 遍历实用指南的详细内容。更多信息请关注PHP中文网其他相关文章!