首页  >  文章  >  web前端  >  TreeWalker:DOM 遍历实用指南

TreeWalker:DOM 遍历实用指南

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-23 01:02:11621浏览

最近我开始利用空闲时间开发一个新的 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. 根节点——从哪里开始遍历
  2. 要显示什么类型的节点(文本、元素、注释等)
  3. 决定接受或拒绝哪些节点的过滤函数

现实世界的例子

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn