Node
DOM 的Node
接口是许多其他 DOM API 对象的基础的抽象基类,因此允许这些对象类型以类似的方式使用,并且通常可以互换使用。作为一个抽象类,不存在像普通Node
对象这样的东西。所有实现Node
功能的对象都基于其子类之一。最值得注意的是Document
、Element
和DocumentFragment
。
此外,每种 DOM 节点都由基于Node
的接口表示。其中包括Attr
、CharacterData
(Text
、Comment
、CDATASection
和ProcessingInstruction
都基于它)以及DocumentType
。
在某些情况下,基本Node
接口的特定功能可能不适用于其子接口之一;在这种情况下,继承节点可能会返回null
或抛出异常,具体取决于情况。例如,尝试向无法包含子节点的节点类型添加子节点将抛出异常。
实例属性
除了下面的属性外,Node
还继承了其父级EventTarget
的属性。.
Node.baseURI
只读-
返回一个字符串,表示包含
Node
的文档的基本 URL。 Node.childNodes
只读-
返回一个包含此节点所有子节点(包括元素、文本和注释)的活动
NodeList
。NodeList
是活动的,这意味着如果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
只读Node.previousSibling
只读-
返回一个表示树中前一个节点的
Node
,如果没有这样的节点,则返回null
。 Node.textContent
-
返回/设置元素及其所有后代的文本内容。
实例方法
除了下面的方法外,Node
还继承了其父级EventTarget
的方法。
Node.appendChild()
-
将指定的
childNode
参数作为最后一个子节点添加到当前节点。如果该参数引用了 DOM 树上的现有节点,则该节点将从其当前位置分离并附加到新位置。 Node.cloneNode()
-
克隆一个
Node
,以及可选的所有内容。默认情况下,它会克隆节点的内容。 Node.compareDocumentPosition()
-
比较当前节点相对于任何其他文档中另一个节点的位置。
Node.contains()
-
返回一个
true
或false
值,指示节点是否为调用节点的后代。 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
。
示例
移除嵌套在节点内的所有子节点
此函数移除元素的每个第一个子节点,直到没有剩余子节点。
function removeAllChildren(element) {
while (element.firstChild) {
element.removeChild(element.firstChild);
}
}
使用此函数只需进行一次调用。这里我们将清空文档的主体。
removeAllChildren(document.body);
另一种方法是将 textContent 设置为空字符串:document.body.textContent = ""
。
递归遍历子节点
以下函数递归地为根节点包含的每个节点(包括根节点本身)调用回调函数。
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
的包装函数来执行搜索。
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 表格仅在浏览器中加载