元素属性是否是节点?

alc*_*vil 3 html javascript dom

根据http://www.w3schools.com/js/js_htmldom_navigation.asp教程,元素属性也是节点.在下面的示例中,脚本仅显示元素节点.

<!DOCTYPE html>
<html>
<body>

<a href="#">link</a>
<p id="demo"></p>

<script>
var n = document.body.childNodes;
var s = "";
for (var i = 0; i < n.length; i++)
  s += n[i].nodeName + "<br>";
document.getElementById("demo").innerHTML = s;
</script>
some text

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

结果(节点名称)是:

#text
A
#text
P
#text
SCRIPT
Run Code Online (Sandbox Code Playgroud)

我猜#text是换行符的节点名称等(但我不知道为什么SCRIPT之后的文本没有显示为#text).

为什么它没有显示href属性?即使我试图查看锚元素的所有子节点,它只显示内部的文本节点.

Fel*_*ing 5

tl; dr:是的,它们是节点,但它们的处理方式不同.

DOM规范:

Attr对象继承Node接口,但由于它们实际上不是它们描述的元素的子节点,因此DOM不认为它们是文档树的一部分.因此,Node属性parentNode,previousSiblingnextSibling具有对象的nullAttr.DOM认为属性是元素的属性,而不是与它们关联的元素具有单独的标识; 这应该使得实现诸如与给定类型的所有元素相关联的默认属性之类的特征更有效.此外,Attr节点可能不是a的直接子节点DocumentFragment.但是,它们可以与Elementa 中包含的节点相关联DocumentFragment.简而言之,DOM的用户和实现者需要意识到Attr节点与继承该Node接口的其他对象有一些共同点,但它们也非常不同.

正如文中所说,属性节点不被认为是元素的子元素,因此它们不包含在元素中childNodes.要获取元素的属性,您可以访问element.attributes.