Document.createNodeIterator()
返回一个新的 NodeIterator
对象。
语法
const nodeIterator = document.createNodeIterator(root[, whatToShow[, filter]]);
参数
root
NodeIterator
遍历起始处的根节点。
whatToShow
可选
常量 | 数字值 | 描述 |
NodeFilter.SHOW_ALL |
-1 (即unsigned long 的最大值) |
显示所有节点。 |
NodeFilter.SHOW_ATTRIBUTE |
2 |
显示 Attr 特性节点。这仅在创建以Attr 特性节点为根节点的TreeWalker 时有意义;在这种情况下,这意味着该特性节点会出现在迭代或遍历的第一位。因为特性节点不会是其他节点的子代,遍历文档树时,特性节点不会出现。 |
NodeFilter.SHOW_CDATA_SECTION |
8 |
显示 CDATASection 节点。 |
NodeFilter.SHOW_COMMENT |
128 |
显示 Comment 节点。 |
NodeFilter.SHOW_DOCUMENT |
256 |
显示 Document 节点。 |
NodeFilter.SHOW_DOCUMENT_FRAGMENT |
1024 |
显示 DocumentFragment 节点。 |
NodeFilter.SHOW_DOCUMENT_TYPE |
512 |
显示 DocumentType 节点。 |
NodeFilter.SHOW_ELEMENT |
1 |
显示 Element 节点。 |
NodeFilter.SHOW_ENTITY |
32 |
显示 Entity 节点。 这仅在创建以Entity 实体节点为根节点的TreeWalker 时有意义;在这种情况下,这意味着该实体节点会出现在迭代或遍历的第一位。因为实体节点不会是其他节点的子代,遍历文档树时,实体节点不会出现。 |
NodeFilter.SHOW_ENTITY_REFERENCE |
16 |
显示 EntityReference 节点。 |
NodeFilter.SHOW_NOTATION |
2048 |
显示 Entity 节点。 这仅在创建以Notation 符号节点为根节点的TreeWalker 时有意义;在这种情况下,这意味着该符号节点会出现在迭代或遍历的第一位。因为符号节点不会是其他节点的子代,遍历文档树时,符号节点不会出现。 |
NodeFilter.SHOW_PROCESSING_INSTRUCTION |
64 |
显示 ProcessingInstruction (en-US) 节点。 |
NodeFilter.SHOW_TEXT |
4 |
显示 Text 节点。 |
filter
可选
是实现 NodeFilter
接口的对象; 其 acceptNode()
方法会对从根节点开始到子树中的每个节点都调用一次,哪些节点需要进入迭代节点列表等待调用则取决于whatToShow参数(也可以使用一个简单的回调函数代替acceptNode()
)。该方法需要返回下列常量之一: NodeFilter.FILTER_ACCEPT
,NodeFilter.FILTER_REJECT
或NodeFilter.FILTER_SKIP
(见NodeFilter),参见示例。
**注意: **在Gecko12.0(Firefox 12.0 / Thunderbird 12.0 / SeaMonkey 2.9)以前,这个方法接收第四个可选的参数(entityReferenceExpansion
),这不是DOM4 规范中的一部分,因此被移除了。这个参数表示实体引用节点的子代对于迭代器是否可见。因为浏览器不会创建这样的节点,这个参数没有任何作用。
示例
const nodeIterator = document.createNodeIterator(
document.body,
NodeFilter.SHOW_ELEMENT,
{
acceptNode(node) {
return node.nodeName.toLowerCase() === 'p' ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
}
}
);
const pars = [];
let currentNode;
while (currentNode = nodeIterator.nextNode()) {
pars.push(currentNode);
}
兼容性
总结
改方法兼容性还是不错的,如果说你要是需要遍历整个dom节点来做些什么这个是个不错的选择,可能比以前递归循环判断要好很多。