Node

DOM 的Node接口是许多其他 DOM API 对象的基础的抽象基类,因此允许这些对象类型以类似的方式使用,并且通常可以互换使用。作为一个抽象类,不存在像普通Node对象这样的东西。所有实现Node功能的对象都基于其子类之一。最值得注意的是DocumentElementDocumentFragment

此外,每种 DOM 节点都由基于Node的接口表示。其中包括AttrCharacterDataTextCommentCDATASectionProcessingInstruction都基于它)以及DocumentType

在某些情况下,基本Node接口的特定功能可能不适用于其子接口之一;在这种情况下,继承节点可能会返回null或抛出异常,具体取决于情况。例如,尝试向无法包含子节点的节点类型添加子节点将抛出异常。

EventTarget Node

实例属性

除了下面的属性外,Node还继承了其父级EventTarget的属性。.

Node.baseURI 只读

返回一个字符串,表示包含Node的文档的基本 URL。

Node.childNodes 只读

返回一个包含此节点所有子节点(包括元素、文本和注释)的活动NodeListNodeList是活动的,这意味着如果Node的子节点发生更改,则NodeList对象会自动更新。

Node.firstChild 只读

返回一个表示节点的第一个直接子节点的Node,如果节点没有子节点,则返回null

Node.isConnected 只读

一个布尔值,指示 Node 是否连接(直接或间接)到上下文对象,例如,在普通 DOM 的情况下为Document对象,在 Shadow DOM 的情况下为ShadowRoot

Node.lastChild 只读

返回一个表示节点的最后一个直接子节点的Node,如果节点没有子节点,则返回null

Node.nextSibling 只读

返回一个表示树中下一个节点的Node,如果没有这样的节点,则返回null

Node.nodeName 只读

返回一个包含Node名称的字符串。名称的结构将随节点类型而异。例如,HTMLElement将包含相应标签的名称,例如HTMLAudioElement'AUDIO'Text节点将具有'#text'字符串,或者Document节点将具有'#document'字符串。

Node.nodeType 只读

返回一个表示节点类型的unsigned short。可能的值为

名称
ELEMENT_NODE 1
ATTRIBUTE_NODE 2
TEXT_NODE 3
CDATA_SECTION_NODE 4
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
Node.nodeValue

返回/设置当前节点的值。

Node.ownerDocument 只读

返回此节点所属的Document。如果节点本身是文档,则返回null

Node.parentNode 只读

返回作为此节点父节点的Node。如果没有这样的节点,例如,如果此节点是树的顶部或不参与树,则此属性返回null

Node.parentElement 只读

返回作为此节点父节点的Element。如果节点没有父节点,或者父节点不是Element,则此属性返回null

Node.previousSibling 只读

返回一个表示树中前一个节点的Node,如果没有这样的节点,则返回null

Node.textContent

返回/设置元素及其所有后代的文本内容。

实例方法

除了下面的方法外,Node还继承了其父级EventTarget的方法。

Node.appendChild()

将指定的childNode参数作为最后一个子节点添加到当前节点。如果该参数引用了 DOM 树上的现有节点,则该节点将从其当前位置分离并附加到新位置。

Node.cloneNode()

克隆一个Node,以及可选的所有内容。默认情况下,它会克隆节点的内容。

Node.compareDocumentPosition()

比较当前节点相对于任何其他文档中另一个节点的位置。

Node.contains()

返回一个truefalse值,指示节点是否为调用节点的后代。

Node.getRootNode()

返回上下文对象的根,如果可用,则可选地包含 Shadow 根。

Node.hasChildNodes()

返回一个布尔值,指示元素是否具有任何子节点。

Node.insertBefore()

将一个Node插入到指定父节点的参考节点之前作为子节点。

Node.isDefaultNamespace()

接受一个命名空间 URI 作为参数,如果该命名空间是给定节点上的默认命名空间,则返回一个值为true的布尔值;否则返回false

Node.isEqualNode()

返回一个布尔值,指示两个节点是否类型相同,并且所有定义数据点都匹配。

Node.isSameNode()

返回一个布尔值,指示两个节点是否相同(即,它们引用同一个对象)。

Node.lookupPrefix()

返回一个包含给定命名空间 URI 的前缀的字符串(如果存在),如果不存在则返回null。当存在多个前缀时,结果取决于实现。

Node.lookupNamespaceURI()

接受一个前缀并返回与之关联的命名空间 URI(如果找到),如果未找到则返回null。为前缀提供null将返回默认命名空间。

Node.normalize()

清理此元素下的所有文本节点(合并相邻节点,删除空节点)。

Node.removeChild()

从当前元素中删除一个子节点,该子节点必须是当前节点的子节点。

Node.replaceChild()

用参数中给出的第二个子Node替换当前的一个子Node

示例

移除嵌套在节点内的所有子节点

此函数移除元素的每个第一个子节点,直到没有剩余子节点。

js

function removeAllChildren(element) {
  while (element.firstChild) {
    element.removeChild(element.firstChild);
  }
}

使用此函数只需进行一次调用。这里我们将清空文档的主体。

js

removeAllChildren(document.body);

另一种方法是将 textContent 设置为空字符串:document.body.textContent = ""

递归遍历子节点

以下函数递归地为根节点包含的每个节点(包括根节点本身)调用回调函数。

js

function eachNode(rootNode, callback) {
  if (!callback) {
    const nodes = [];
    eachNode(rootNode, (node) => {
      nodes.push(node);
    });
    return nodes;
  }

  if (callback(rootNode) === false) {
    return false;
  }

  if (rootNode.hasChildNodes()) {
    for (const node of rootNode.childNodes) {
      if (eachNode(node, callback) === false) {
        return;
      }
    }
  }
}

该函数递归地为rootNode的每个后代节点(包括根节点本身)调用一个函数。

如果省略了callback,则该函数返回一个Array,其中包含rootNode和其中包含的所有节点。

如果提供了callback,并且在调用时返回false,则当前递归级别将被中止,并且函数将在上一级父级的级别继续执行。这可以用来在找到节点后中止循环(例如搜索包含特定字符串的文本节点)。

该函数有两个参数

rootNode

将递归遍历其后代的Node对象。

callback 可选

一个可选的回调函数,它接收一个Node作为其唯一参数。如果省略,则eachNode返回一个Array,其中包含rootNode中包含的每个节点(包括根节点本身)。

以下演示了eachNode()函数的实际应用:在网页上搜索文本。

我们使用一个名为grep的包装函数来执行搜索。

js

function grep(parentNode, pattern) {
  let matches = [];
  let endScan = false;

  eachNode(parentNode, (node) => {
    if (endScan) {
      return false;
    }

    // Ignore anything which isn't a text node
    if (node.nodeType !== Node.TEXT_NODE) {
      return;
    }

    if (typeof pattern === "string" && node.textContent.includes(pattern)) {
      matches.push(node);
    } else if (pattern.test(node.textContent)) {
      if (!pattern.global) {
        endScan = true;
        matches = node;
      } else {
        matches.push(node);
      }
    }
  });

  return matches;
}

规范

规范
DOM 标准
# 接口-节点

浏览器兼容性

BCD 表格仅在浏览器中加载