当前位置: 首页 > news >正文

DOM TreeWalker API 详解

DOM TreeWalker API 详解

TreeWalker API 是 DOM 中一个强大但相对较少使用的功能,它提供了一种有效遍历文档树的方式。它比手动递归或使用简单的节点导航方法更加灵活和高效。

TreeWalker 基本概念

TreeWalker 对象可以让你按照指定的过滤条件,以特定的顺序遍历 DOM 树中的节点。它主要通过 document.createTreeWalker() 方法创建。

创建 TreeWalker

const treeWalker = document.createTreeWalker(root,           // 开始遍历的根节点whatToShow,     // 位掩码,指定要包含哪些节点类型filter,         // 可选的 NodeFilter 对象或函数entityReferenceExpansion // 布尔值,在HTML DOM中通常忽略
);

whatToShow 常量

whatToShow 参数是一个位掩码,用于指定要访问的节点类型:

  • NodeFilter.SHOW_ALL: 显示所有节点类型
  • NodeFilter.SHOW_ELEMENT: 显示元素节点
  • NodeFilter.SHOW_TEXT: 显示文本节点
  • NodeFilter.SHOW_COMMENT: 显示注释节点
  • 等等…

过滤器

过滤器可以是一个实现了 acceptNode() 方法的对象,或者一个返回接受状态的函数:

  • NodeFilter.FILTER_ACCEPT: 接受该节点
  • NodeFilter.FILTER_REJECT: 拒绝该节点及其子树
  • NodeFilter.FILTER_SKIP: 跳过该节点,但考虑其子节点

TreeWalker 方法

一旦创建了 TreeWalker,可以使用以下方法进行导航:

  • currentNode: 获取或设置当前节点
  • parentNode(): 移动到父节点并返回它
  • firstChild(): 移动到第一个子节点并返回它
  • lastChild(): 移动到最后一个子节点并返回它
  • nextNode(): 移动到下一个节点(按文档顺序)并返回它
  • previousNode(): 移动到上一个节点并返回它
  • nextSibling(): 移动到下一个兄弟节点并返回它
  • previousSibling(): 移动到上一个兄弟节点并返回它

实际应用示例

示例1:查找所有文本节点

// 创建一个只显示文本节点的 TreeWalker
const walker = document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,null,false
);const textNodes = [];
let currentNode;// 遍历所有文本节点
while (currentNode = walker.nextNode()) {// 忽略空白文本节点if (currentNode.nodeValue.trim() !== '') {textNodes.push(currentNode);}
}console.log(`找到 ${textNodes.length} 个非空文本节点`);

示例2:使用自定义过滤器

// 创建一个自定义过滤器,只接受具有特定类的元素
const filter = {acceptNode: function(node) {// 只接受带有 "highlight" 类的元素if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains('highlight')) {return NodeFilter.FILTER_ACCEPT;}return NodeFilter.FILTER_SKIP;}
};const walker = document.createTreeWalker(document.body,NodeFilter.SHOW_ELEMENT,filter,false
);const highlightedElements = [];
let currentNode;while (currentNode = walker.nextNode()) {highlightedElements.push(currentNode);
}console.log(`找到 ${highlightedElements.length} 个高亮元素`);

示例3:深度优先遍历

function traverseDOM(root) {const walker = document.createTreeWalker(root,NodeFilter.SHOW_ELEMENT,null,false);let depth = 0;let node = walker.currentNode;// 打印当前节点console.log(`${' '.repeat(depth)} <${node.nodeName.toLowerCase()}>`);// 递归处理子节点let child = walker.firstChild();while (child) {depth++;console.log(`${' '.repeat(depth)} <${child.nodeName.toLowerCase()}>`);// 尝试进入更深层if (walker.firstChild()) {continue;}// 没有子节点,尝试下一个兄弟节点while (!walker.nextSibling() && depth > 0) {// 回到父节点层级walker.parentNode();depth--;}}
}traverseDOM(document.body);

与其他 DOM 遍历方法的比较

与手动遍历 DOM 树相比,TreeWalker 提供了以下优势:

  1. 性能:对于复杂的 DOM 树,TreeWalker 通常比递归方法更高效
  2. 灵活性:内置的过滤功能让你只关注感兴趣的节点
  3. 可控性:能够轻松地在树中上下左右移动
  4. 状态保持:保留当前位置,便于暂停和恢复遍历

浏览器兼容性

TreeWalker API 在所有现代浏览器中都得到了良好的支持,包括 Chrome、Firefox、Safari、Edge 等。

总结

DOM TreeWalker API 是一个强大的工具,特别适合复杂的 DOM 遍历任务。它提供了灵活的过滤机制和直观的导航方法,能够有效地解决许多前端开发中的 DOM 操作问题。无论是搜索特定元素、提取文本内容,还是执行复杂的 DOM 分析,TreeWalker 都能提供高效的解决方案。

http://www.xdnf.cn/news/22555.html

相关文章:

  • 5.常用控件-QWidget|enabled|geometry|window frame(C++)
  • Java 如何保证线程安全
  • 运营商二要素认证接口如何对接?
  • Enovia许可证管理与监控工具
  • 五款小众工作软件
  • 【LLMs篇】09:白话PPO训练
  • 提示词阶段总结
  • 基于用户的协同过滤推荐系统实战项目
  • webgl入门实例-12WebGL 投影矩阵 (Projection Matrix)基本概念
  • 工业安卓主板在智能电子秤设备中的应用
  • 使用人工智能大模型,如何免费快速把录音转成文本,并形成会议纪要
  • AIP目录
  • HCIP-H12-821 核心知识梳理 (4)
  • 强化学习算法系列(六):应用最广泛的算法——PPO算法
  • 完整调用DeepSeek篇(java)
  • 项目实战--新闻分类
  • 信息系统项目管理师_第十一章 项目采购管理
  • win10系统完美配置mamba-ssm全整合方案
  • 爱普生RX8010SJ实时时钟模块在安防监控设备中的应用
  • 守护进程编程以及ssh反向代理
  • AUTOSAR图解==>AUTOSAR_SWS_CryptoInterface
  • 淘宝商品搜索爬虫:Python 实现教程
  • 江苏广电HC2910-创维代工-Hi3798cv200-2+8G-海美迪安卓7.0-强刷包
  • 深度学习-torch,全连接神经网路
  • 软硬链接与动静态库基本概念(快速回顾)
  • 浅析数据库面试问题
  • `get_peft_model` 是 `peft` 库什么方法
  • 【CPP】死锁产生、排查、避免
  • 国内主要半导体厂家
  • Java 接入deepseek(非流式)