Risposte:
Comprendi che .childrenè una proprietà di un elemento . 1 Solo gli elementi hanno .children, e questi figli sono tutti di tipo Element. 2
Tuttavia, .childNodesè una proprietà di Node . .childNodespuò contenere qualsiasi nodo. 3
Un esempio concreto sarebbe:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
Il più delle volte, vuoi usarlo .childrenperché generalmente non vuoi passare in rassegna i nodi di testo o commento nella tua manipolazione DOM.
Se vuoi manipolare i nodi di testo, probabilmente vorrai .textContentinvece. 4
1. Tecnicamente, è un attributo di ParentNode , un mixin incluso da Element.
2. Sono tutti elementi perché .childrenè un HTMLCollection , che può contenere solo elementi.
3. Allo stesso modo, .childNodespuò contenere qualsiasi nodo perché è un NodeList .
4. Or .innerText. Vedi le differenze qui o qui .
.childreni documenti XML : jsfiddle.net/fbwbjvch/1
Element.childrenrestituisce solo elementi figlio, mentre Node.childNodesrestituisce tutti i nodi figlio. Si noti che gli elementi sono nodi, quindi entrambi sono disponibili sugli elementi.
Credo childNodessia più affidabile. Ad esempio, MDC (collegato sopra) osserva che IE ha funzionato childrencorrettamente solo in IE 9. childNodesoffre meno spazio agli errori dagli implementatori del browser.
.childrennon filtra i nodi di commento, ma filtra i nodi di testo.
.getElementsByTagName('*'). IE a volte può essere così fastidioso ...
childrentale supporto IE.
Buone risposte finora, voglio solo aggiungere che è possibile verificare il tipo di nodo usando nodeType:
yourElement.nodeType
Questo ti darà un numero intero: (preso da qui )
| 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. | |
Si noti che secondo Mozilla :
Le seguenti costanti sono state deprecate e non devono più essere utilizzate: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Andrò con ParentNode.children :
Poiché fornisce un namedItemmetodo che mi consente di ottenere direttamente uno degli elementi figlio senza scorrere tutti i bambini o evitare di usarlogetElementById ecc.
per esempio
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Andrò con Node.childNodes :
Come fornisce forEachmetodo quando lavoro con window.IntersectionObserver
es
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
Su Chrome 83
Node.childNodes fornisce
entries,forEach,item,keys,lengthevaluesParentNode.children fornisce
item,lengthenamedItem