NodeIterator是DOM提供的按文档顺序深度优先遍历节点的接口,需用document.createNodeIterator(root, whatToShow, filter, false)创建,其中filter必须为含acceptNode方法的对象,返回FILTER_ACCEPT/REJECT/SKIP;nextNode()逐个返回符合条件节点,惰性求值且支持动态剪枝。

NodeIterator 是 DOM 提供的一个用于遍历节点的接口,它比简单循环 childNodes 更灵活、更可控,特别适合按条件筛选特定类型的节点(比如只取文本节点、只取带某 class 的元素、跳过注释等)。它的核心在于“过滤器”和“遍历控制”,而不是一次性获取全部再筛。
用 document.createNodeIterator 创建可筛选的迭代器
创建 NodeIterator 需调用 document.createNodeIterator(),传入根节点、要保留的节点类型(bitmask)、可选的 NodeFilter 对象(定义筛选逻辑)以及是否扩展实体引用(一般为 false):
-
root:遍历起始节点(如
document.body) -
whatToShow:位掩码值,常用
NodeFilter.SHOW_ELEMENT、NodeFilter.SHOW_TEXT、或用 | 组合(如NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT) -
filter:可选的 NodeFilter 对象,含
acceptNode(node)方法,返回NodeFilter.FILTER_ACCEPT、.FILTER_REJECT或.FILTER_SKIP
自定义 filter 实现复杂条件筛选
NodeFilter 不是构造函数,而是规范约定的对象结构。你可以直接传一个对象,其 acceptNode 方法决定每个节点是否被纳入迭代序列:
const iterator = document.createNodeIterator(
document.body,
NodeFilter.SHOW_ELEMENT,
{
acceptNode(node) {
// 只接受有 class="highlight" 的元素
return node.classList?.contains('highlight')
? NodeFilter.FILTER_ACCEPT
: NodeFilter.FILTER_REJECT;
}
}
);注意:FILTER_SKIP 表示跳过该节点(但会继续遍历其子节点),FILTER_REJECT 则彻底排除该节点及其后代(相当于剪枝)。
立即学习“Java免费学习笔记(深入)”;
生成Blender Python (bpy)脚本,该脚本使用node_groups API和GeometryNodeTree接口程序化地创建几何节点修改器树,用于参数化3D资产生成。
用 nextNode() 和 previousNode() 逐个取符合条件的节点
NodeIterator 实例提供 nextNode() 和 previousNode() 方法,每次调用返回下一个/上一个被接受的节点(即通过 filter 的节点),直到无更多匹配项时返回 null:
const nodes = [];
let node;
while ((node = iterator.nextNode()) !== null) {
nodes.push(node);
}
// nodes 就是所有 class="highlight" 的元素(按文档顺序)这种方式天然惰性求值,不预先构建完整列表,内存友好,也便于中途 break 或做条件处理。
对比 querySelectorAll:何时选 NodeIterator?
querySelectorAll 快且简洁,但仅支持 CSS 选择器语法;NodeIterator 的优势在于:
- 能混合判断节点类型、属性、内容、父子关系等任意 JS 逻辑(比如“文本节点内容长度 > 10”、“元素有 data-* 属性但无 id”)
- 可动态控制遍历深度(FILTER_REJECT 剪枝)
- 适合需要边遍历边修改 DOM 的场景(相比 getElementsByTagName 等快照式 API,NodeIterator 在遍历时仍能反映实时结构)
不过,若只是选元素,优先用 querySelectorAll;需精细控制或非 CSS 可表达的逻辑时,NodeIterator 更合适。

















