如何在javascript中删除textNodes,或者只是跳过它
如何从JavaScript中删除textNodes或者跳过它们
在理解这个问题之前,需要了解以下几点:
1. `.children`是Element的属性,只有Element才有这个属性,而且这些children都是Element类型。
2. 然而,`.childNodes`是Node的属性,`.childNodes`可以包含任何类型的节点。
具体举个例子:
let el = document.createElement("div"); el.textContent = "foo"; el.childNodes.length === 1; // 包含一个Text节点子节点 el.children.length === 0; // 没有Element子节点
大多数情况下,我们希望使用`.children`,因为通常我们不希望在DOM操作中循环遍历Text或Comment节点。
如果确实需要操作Text节点,可能需要使用`.textContent`代替。
这里还有一些补充说明:
1. 技术上讲,`children`是`ParentNode`的属性,它是Element包含的一个mixin。
2. 由于`.children`是`HTMLCollection`,它只能包含元素,所以它们都是元素节点。
3. 类似地,`.childNodes`可以包含任何类型的节点,因为它是`NodeList`类型。
4. 或者使用`.innerText`,可以在这里了解到它们之间的区别。
是的,IE似乎存在一些问题。
实际上,`children`是`parentnode`接口的属性,而不是Element的。
iOS 8.3(或许其他版本也是)不支持在XML文档上使用`.children`。
在Microsoft Edge上,XML节点可能会出现问题,它似乎不喜欢`children`。
这是“element vs. node”的自然延伸。
文章来源:
- [quirksmode.org](http://www.quirksmode.org/dom/w3c_core.html#t71)
- [usonsci.wordpress.com](http://usonsci.wordpress.com/2014/09/30/html-children-vs-childnodes/)
- [stackoverflow.com](http://stackoverflow.com/questions/132564)
- [jsfiddle.net](http://jsfiddle.net/fbwbjvch/1/)