节点对象和元素对象之间的区别?

我完全混淆了Node对象和Element对象。 document.getElementById()返回Element对象,而document.getElementsByClassName()返回NodeList对象(元素或节点的集合?)

如果一个div是一个元素对象那么div节点对象呢?

什么是节点对象?

文档对象,Element对象和Text对象是否也是Node对象?

根据David Flanagan的书“文档对象,其元素对象和文本对象都是节点对象”。

那么为什么一个对象可以inheritanceElement对象的属性/方法以及Node对象呢?

如果是的话,我猜Node类和Element类是在原型inheritance树中相关的。

  <div id="test"> <p class="para"> 123 </p> <p class="para"> abc </p> </div> <p id="id_para"> next </p> document.documentElement.toString(); // [object HTMLHtmlElement] var div = document.getElementById("test"); div.toString(); // [object HTMLDivElement] var p1 = document.getElementById("id_para"); p1.toString(); // [object HTMLParagraphElement] var p2 = document.getElementsByClassName("para"); p2.toString(); //[object HTMLCollection] 

node是DOM层次结构中任何types对象的通用名称。 node可以是内build的DOM元素之一,例如documentdocument.body ,它可以是HTML中指定的HTML标签,如<input><p> ,也可以是由系统在另一个元素内部保存一段文本。 所以,简而言之, node是任何DOM对象。

element是一种特定types的node因为还有许多其他types的节点(文本节点,注释节点,文档节点等)。

DOM由一个节点层次组成,每个节点可以有一个父节点,一个子节点列表和一个nextSibling和previousSibling。 这个结构形成了一个树状的层次结构。 document节点将具有其子节点( head节点和body节点)的列表。 body节点将有它的子节点的列表(HTML页面中的顶层元素)等等。

所以, nodeList只是一个类似于数组的nodes列表。

元素是特定types的节点,可以直接在HTML中用HTML标签指定,可以具有像idclass属性。 可以有孩子等等。还有其他types的节点,如注释节点,文本节点等等,具有不同的特征。 每个节点都有一个属性.nodeType ,它报告它是什么types的节点。 您可以在这里看到各种types的节点(来自MDN的图表):

在这里输入图像说明

您可以看到ELEMENT_NODEnodeType属性的值为1一种特定types的节点。

所以document.getElementById("test")只能返回一个节点,它保证是一个元素(特定types的节点)。 因为它只是返回元素而不是列表。

由于document.getElementsByClassName("para")可以返回多个对象,因此devise人员select返回一个nodeList因为这是他们为多个节点列表创build的数据types。 由于这些元素只能是元素(只有元素通常有一个类名),所以它在技术上是一个nodeList ,它只有元素types的节点,而devise者可以创build一个不同名称的elementList作为elementList ,但是他们select只使用一种types的集合,不pipe它是否只有元素。


编辑: HTML5定义了一个HTML元素列表(不是任何节点,只有元素)的HTMLCollection 。 HTML5中的一些属性或方法现在返回一个HTMLCollection 。 虽然它与nodeList接口非常相似,但是现在区分它只包含元素,而不包含任何types的节点。

nodeListHTMLCollection之间的区别对你如何使用它没有什么影响(据我所知),但HTML5的devise者现在已经做出了区分。

例如, element.children属性返回一个实时的HTMLCollection。

Node是为了实现一个树结构,所以它的方法是针对firstChildlastChildchildNodes等。它更多地是一个通用树结构的类。

然后,一些Node对象也是Element对象。 ElementNodeinheritance。 Element对象实际上代表了HTML文件中由诸如<div id="content"></div>的标签指定的对象。 Element类定义属性和方法,如attributesidinnerHTMLclientWidthblur()focus()

一些Node对象是文本节点,它们不是Element对象。 对于HTML文档,每个Node对象都有一个nodeType属性,用于指示它是哪种types的节点:

 1: Element node 3: Text node 8: Comment node 9: the top level node, which is document 

我们可以在控制台中看到一些例子:

 > document instanceof Node true > document instanceof Element false > document.firstChild <html>...</html> > document.firstChild instanceof Node true > document.firstChild instanceof Element true > document.firstChild.firstChild.nextElementSibling <body>...</body> > document.firstChild.firstChild.nextElementSibling === document.body true > document.firstChild.firstChild.nextSibling #text > document.firstChild.firstChild.nextSibling instanceof Node true > document.firstChild.firstChild.nextSibling instanceof Element false > Element.prototype.__proto__ === Node.prototype true 

上面的最后一行显示ElementNodeinheritance。 (由于__proto__ ,该行在IE中不能正常工作,需要使用Chrome,Firefox或Safari)。

顺便说一下, document对象是节点树的顶部, documentDocument对象, DocumentNodeinheritance的:

 > Document.prototype.__proto__ === Node.prototype true 

以下是Node和Element类的一些文档:
https://developer.mozilla.org/en-US/docs/DOM/Node
https://developer.mozilla.org/en-US/docs/DOM/Element

所有您的DOM困境的最佳信息来源

http://www.w3.org/TR/dom/#nodes

“实现Document,DocumentFragment,DocumentType,Element,Text,ProcessingInstruction或Comment接口(简称节点)的对象参与树。

http://www.w3.org/TR/dom/#element

“元素节点简单地称为元素”。

节点: http : //www.w3schools.com/js/js_htmldom_nodes.asp

节点对象表示文档树中的单个节点。 节点可以是元素节点,属性节点,文本节点或“节点types”一章中介绍的任何其他节点types。

元素: http : //www.w3schools.com/js/js_htmldom_elements.asp

Element对象表示XML文档中的元素。 元素可能包含属性,其他元素或文本。 如果一个元素包含文本,则文本在文本节点中表示。

重复:

  • XML中元素和节点之间有什么区别?
  • 为什么节点和元素在XML中有所不同? 基本原理是什么?

节点通常用来表示标签。 分为3种types:

属性注意:是其中有属性的节点。 Exp: <p id=”123”></p>

文本节点:是开放和closures之间的节点,具有康乃馨文本内容。 Exp: <p>Hello</p>

元素节点:是其内部具有其他标签的节点。 Exp: <p><b></b></p>

每个节点可以是同时types的,不一定只有一种types。

元素只是一个元素节点。