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 . .childNodes
può 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 .children
perché 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 .textContent
invece. 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, .childNodes
può contenere qualsiasi nodo perché è un NodeList .
4. Or .innerText
. Vedi le differenze qui o qui .
.children
i documenti XML : jsfiddle.net/fbwbjvch/1
Element.children
restituisce solo elementi figlio, mentre Node.childNodes
restituisce tutti i nodi figlio. Si noti che gli elementi sono nodi, quindi entrambi sono disponibili sugli elementi.
Credo childNodes
sia più affidabile. Ad esempio, MDC (collegato sopra) osserva che IE ha funzionato children
correttamente solo in IE 9. childNodes
offre meno spazio agli errori dagli implementatori del browser.
.children
non filtra i nodi di commento, ma filtra i nodi di testo.
.getElementsByTagName('*')
. IE a volte può essere così fastidioso ...
children
tale 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 namedItem
metodo 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 forEach
metodo 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
,length
evalues
ParentNode.children fornisce
item
,length
enamedItem