文档:createNodeIterator() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Document.createNodeIterator() 方法返回一个新的 NodeIterator 对象。

语法

js
createNodeIterator(root)
createNodeIterator(root, whatToShow)
createNodeIterator(root, whatToShow, filter)

参数

作为 NodeIterator 遍历起始点的根节点。

whatToShow 可选

一个可选的 unsigned long,表示通过组合 NodeFilter 的常量属性创建的位掩码。这是一种方便地过滤特定类型节点的方法。它默认为 0xFFFFFFFF,表示 SHOW_ALL 常量。

常量 数值 描述
NodeFilter.SHOW_ALL 4294967295(即 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 已弃用,不再可用。
NodeFilter.SHOW_ENTITY_REFERENCE 已弃用 16 已弃用,不再可用。
NodeFilter.SHOW_NOTATION 已弃用 2048 已弃用,不再可用。
NodeFilter.SHOW_PROCESSING_INSTRUCTION 64 显示 ProcessingInstruction 节点。
NodeFilter.SHOW_TEXT 4 显示 Text 节点。
filter 可选

一个回调函数或一个带有 acceptNode() 方法的对象。该函数或方法将针对根节点下子树中的每个节点(根据 whatToShow 标志被接受为包含在内)进行调用,以确定是否将其包含在可迭代节点列表中。该方法应返回 NodeFilter.FILTER_ACCEPTNodeFilter.FILTER_REJECTNodeFilter.FILTER_SKIP 之一。请参阅示例

对于 createNodeIterator,值 NodeFilter.FILTER_REJECTNodeFilter.FILTER_SKIP 是等效的。此节点不会包含在可迭代节点列表中,但其子节点将继续被迭代。

返回值

一个新的 NodeIterator 对象。

示例

js
const nodeIterator = document.createNodeIterator(
  document.body,
  NodeFilter.SHOW_ELEMENT,
  (node) =>
    node.nodeName.toLowerCase() === "p"
      ? NodeFilter.FILTER_ACCEPT
      : NodeFilter.FILTER_REJECT,
);
const pars = [];
let currentNode;

while ((currentNode = nodeIterator.nextNode())) {
  pars.push(currentNode);
}

同样,但使用带有 acceptNode() 方法的对象

js
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
# dom-document-createnodeiterator

浏览器兼容性