HTML中Node对象和Element对象的异同

115 阅读2分钟

在一次代码开发过程中偶然发现元素节点有两个属性childNodes以及children。引发了我到底要使用哪个对象的思考,现在开始搞清楚两者之间的异同。

childNodes和children属性返回的到底是什么?

  • childNodes返回的是HTML的 Node 接口对象。
  • children返回的是HTML的 Element 接口对象。

Node接口对象和Element接口对象的联系

Element接口继承了Node接口,因此Element接口可以使用Node接口的所有属性和方法。但Node实例则不能使用Element实例的内容。

Node接口对象和Element接口对象的区别

  • Node表示HTML文档的任意节点,如元素节点,文本节点,注释节点等。
  • Element只能表示HTML文档中的元素节点

image.png

可以看到Element节点是获取不到文本节点内容的。因此当我们需要以节点形式操作文本时,只能使用Node对象。

使用Node对象时怎么插入元素

当需要操作到文本节点时,应使用Node对象。Element对象上的方法不可用,比如我们常用的Element.insertAdjacentHTML。Node节点插入元素的方法相对较少,常用的有appendChild和insertBefore (一般用到添加子元素时,Node对象一般为Element。不过还是可以了解下appendChild和insertBefore)

  • Node.appendChild()  方法将一个节点附加到指定父节点的子节点列表的末尾处。如果将被插入的节点已经存在于当前文档的文档树中,那么 appendChild() 只会将它从原先的位置移动到新的位置(不需要事先移除要移动的节点)。
  • Node.insertBefore()  方法在参考节点之前插入一个拥有指定父节点的子节点。如果给定的子节点是对文档中现有节点的引用,insertBefore() 会将其从当前位置移动到新位置(在将节点附加到其他节点之前,不需要从其父节点删除该节点)。

Node节点常用属性

  • nodeName 为一个只读属性,返回当前节点的节点名称字符串
  • nodeType 同样为只读属性,返回一个整型,对应节点的类型,如

image.png

总结

  • Node是Element接口的父类,因此Element实例可以使用Node实例的方法和属性,而Node实例则无法使用Element实例的内容。

  • Node可以表示文档中的任意节点,而Element只能表示元素节点,想操作文本节点时只能用Node对象

  • 想将文本Node节点转成Element节点是不可行的。当在操作Node想使用Element实例的方法,只能是Node的nodeType为Node.Element_NODE时可以实现。