在一次代码开发过程中偶然发现元素节点有两个属性childNodes以及children。引发了我到底要使用哪个对象的思考,现在开始搞清楚两者之间的异同。
childNodes和children属性返回的到底是什么?
- childNodes返回的是HTML的 Node 接口对象。
- children返回的是HTML的 Element 接口对象。
Node接口对象和Element接口对象的联系
Element接口继承了Node接口,因此Element接口可以使用Node接口的所有属性和方法。但Node实例则不能使用Element实例的内容。
Node接口对象和Element接口对象的区别
- Node表示HTML文档的任意节点,如元素节点,文本节点,注释节点等。
- Element只能表示HTML文档中的元素节点
如
可以看到Element节点是获取不到文本节点内容的。因此当我们需要以节点形式操作文本时,只能使用Node对象。
使用Node对象时怎么插入元素
当需要操作到文本节点时,应使用Node对象。Element对象上的方法不可用,比如我们常用的Element.insertAdjacentHTML。Node节点插入元素的方法相对较少,常用的有appendChild和insertBefore (一般用到添加子元素时,Node对象一般为Element。不过还是可以了解下appendChild和insertBefore)
Node.appendChild()方法将一个节点附加到指定父节点的子节点列表的末尾处。如果将被插入的节点已经存在于当前文档的文档树中,那么appendChild()只会将它从原先的位置移动到新的位置(不需要事先移除要移动的节点)。Node.insertBefore()方法在参考节点之前插入一个拥有指定父节点的子节点。如果给定的子节点是对文档中现有节点的引用,insertBefore()会将其从当前位置移动到新位置(在将节点附加到其他节点之前,不需要从其父节点删除该节点)。
Node节点常用属性
- nodeName 为一个只读属性,返回当前节点的节点名称字符串
- nodeType 同样为只读属性,返回一个整型,对应节点的类型,如
总结
-
Node是Element接口的父类,因此Element实例可以使用Node实例的方法和属性,而Node实例则无法使用Element实例的内容。
-
Node可以表示文档中的任意节点,而Element只能表示元素节点,想操作文本节点时只能用Node对象
-
想将文本Node节点转成Element节点是不可行的。当在操作Node想使用Element实例的方法,只能是Node的nodeType为Node.Element_NODE时可以实现。