Respuestas:
Comprende que .children
es una propiedad de un Elemento . 1 Solo los elementos tienen .children
, y estos elementos secundarios son todos de tipo Elemento. 2
Sin embargo, .childNodes
es propiedad de Node . .childNodes
puede contener cualquier nodo 3
Un ejemplo concreto sería:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
La mayoría de las veces, desea usarlo .children
porque generalmente no desea recorrer los nodos de Texto o Comentario en su manipulación DOM.
Si desea manipular nodos de texto, probablemente lo desee .textContent
. 4 4
1. Técnicamente, es un atributo de ParentNode , un mixin incluido por Element.
2. Todos son elementos porque .children
es una colección HTMLC , que solo puede contener elementos.
3. De manera similar, .childNodes
puede contener cualquier nodo porque es una NodeList .
4. Or .innerText
. Vea las diferencias aquí o aquí .
.children
con documentos XML : jsfiddle.net/fbwbjvch/1
Element.children
solo devuelve elementos secundarios, mientras que Node.childNodes
devuelve todos los elementos secundarios del nodo . Tenga en cuenta que los elementos son nodos, por lo que ambos están disponibles en los elementos.
Creo que childNodes
es más confiable. Por ejemplo, MDC (vinculado anteriormente) señala que IE solo children
acertó en IE 9. childNodes
proporciona menos margen de error por parte de los implementadores del navegador.
.children
no filtra los nodos de comentarios, pero filtra los nodos de texto.
.getElementsByTagName('*')
. IE puede ser tan molesto a veces ...
children
ese soporte IE.
Buenas respuestas hasta ahora, solo quiero agregar que puede verificar el tipo de nodo usando nodeType
:
yourElement.nodeType
Esto le dará un número entero: (tomado de aquí )
| Value | Constant | Description | |
|-------|----------------------------------|---------------------------------------------------------------|--|
| 1 | Node.ELEMENT_NODE | An Element node such as <p> or <div>. | |
| 2 | Node.ATTRIBUTE_NODE | An Attribute of an Element. The element attributes | |
| | | are no longer implementing the Node interface in | |
| | | DOM4 specification. | |
| 3 | Node.TEXT_NODE | The actual Text of Element or Attr. | |
| 4 | Node.CDATA_SECTION_NODE | A CDATASection. | |
| 5 | Node.ENTITY_REFERENCE_NODE | An XML Entity Reference node. Removed in DOM4 specification. | |
| 6 | Node.ENTITY_NODE | An XML <!ENTITY ...> node. Removed in DOM4 specification. | |
| 7 | Node.PROCESSING_INSTRUCTION_NODE | A ProcessingInstruction of an XML document | |
| | | such as <?xml-stylesheet ... ?> declaration. | |
| 8 | Node.COMMENT_NODE | A Comment node. | |
| 9 | Node.DOCUMENT_NODE | A Document node. | |
| 10 | Node.DOCUMENT_TYPE_NODE | A DocumentType node e.g. <!DOCTYPE html> for HTML5 documents. | |
| 11 | Node.DOCUMENT_FRAGMENT_NODE | A DocumentFragment node. | |
| 12 | Node.NOTATION_NODE | An XML <!NOTATION ...> node. Removed in DOM4 specification. | |
Tenga en cuenta que según Mozilla :
Las siguientes constantes han quedado en desuso y ya no deben usarse: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Iré con ParentNode.children :
Como proporciona un namedItem
método que me permite obtener directamente uno de los elementos secundarios sin recorrer todos los elementos secundarios o evitar su uso, getElementById
etc.
p.ej
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Iré con Node.childNodes :
Como proporciona forEach
método cuando trabajo con, window.IntersectionObserver
por ejemplo,
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
En Chrome 83
Node.childNodes proporciona
entries
,forEach
,item
,keys
,length
yvalues
ParentNode.children proporciona
item
,length
ynamedItem