节点对象和元素对象之间的区别?
我完全混淆了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元素之一,例如document
或document.body
,它可以是HTML中指定的HTML标签,如<input>
或<p>
,也可以是由系统在另一个元素内部保存一段文本。 所以,简而言之, node
是任何DOM对象。
element
是一种特定types的node
因为还有许多其他types的节点(文本节点,注释节点,文档节点等)。
DOM由一个节点层次组成,每个节点可以有一个父节点,一个子节点列表和一个nextSibling和previousSibling。 这个结构形成了一个树状的层次结构。 document
节点将具有其子节点( head
节点和body
节点)的列表。 body
节点将有它的子节点的列表(HTML页面中的顶层元素)等等。
所以, nodeList
只是一个类似于数组的nodes
列表。
元素是特定types的节点,可以直接在HTML中用HTML标签指定,可以具有像id
或class
属性。 可以有孩子等等。还有其他types的节点,如注释节点,文本节点等等,具有不同的特征。 每个节点都有一个属性.nodeType
,它报告它是什么types的节点。 您可以在这里看到各种types的节点(来自MDN的图表):
您可以看到ELEMENT_NODE
是nodeType
属性的值为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的节点。
nodeList
和HTMLCollection
之间的区别对你如何使用它没有什么影响(据我所知),但HTML5的devise者现在已经做出了区分。
例如, element.children
属性返回一个实时的HTMLCollection。
Node
是为了实现一个树结构,所以它的方法是针对firstChild
, lastChild
, childNodes
等。它更多地是一个通用树结构的类。
然后,一些Node
对象也是Element
对象。 Element
从Node
inheritance。 Element
对象实际上代表了HTML文件中由诸如<div id="content"></div>
的标签指定的对象。 Element
类定义属性和方法,如attributes
, id
, innerHTML
, clientWidth
, blur()
和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
上面的最后一行显示Element
从Node
inheritance。 (由于__proto__
,该行在IE中不能正常工作,需要使用Chrome,Firefox或Safari)。
顺便说一下, document
对象是节点树的顶部, document
是Document
对象, Document
从Node
inheritance的:
> 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。
元素只是一个元素节点。