Réponses:
Comprenez que .childrenc'est une propriété d'un élément . 1 Seuls les éléments ont .children, et ces enfants sont tous de type élément. 2
Cependant, .childNodesest une propriété de Node . .childNodespeut contenir n'importe quel nœud. 3
Un exemple concret serait:
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 plupart du temps, vous voulez l'utiliser .childrenparce que généralement vous ne voulez pas faire de boucle sur les nœuds Texte ou Commentaire dans votre manipulation DOM.
Si vous souhaitez manipuler des nœuds de texte, vous le souhaitez probablement à la .textContentplace. 4
1. Techniquement, c'est un attribut de ParentNode , un mixin inclus par Element.
2. Ce sont tous des éléments car il .childrens'agit d'une HTMLCollection , qui ne peut contenir que des éléments.
3. De même, .childNodespeut contenir n'importe quel nœud car il s'agit d'une NodeList .
4. Ou .innerText. Voir les différences ici ou ici .
.childrensur les documents XML : jsfiddle.net/fbwbjvch/1
Element.childrenrenvoie uniquement les enfants des éléments , tandis que Node.childNodesrenvoie tous les enfants des nœuds . Notez que les éléments sont des nœuds, donc les deux sont disponibles sur les éléments.
Je pense que childNodesc'est plus fiable. Par exemple, MDC (lié ci-dessus) note qu'IE ne fonctionne que childrendans IE 9. childNodesoffre moins de marge d'erreur aux implémenteurs de navigateur.
.childrenil ne filtre pas les nœuds de commentaire, mais il filtre les nœuds de texte.
.getElementsByTagName('*'). IE peut être si ennuyeux parfois ...
childrenqui prennent en charge IE.
De bonnes réponses jusqu'à présent, je veux seulement ajouter que vous pouvez vérifier le type d'un nœud en utilisant nodeType:
yourElement.nodeType
Cela vous donnera un entier: (extrait d' ici )
| 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. | |
Notez que selon Mozilla :
Les constantes suivantes sont obsolètes et ne doivent plus être utilisées: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
J'irai avec ParentNode.children :
Comme il fournit une namedItemméthode qui me permet d'obtenir directement l'un des éléments enfants sans parcourir tous les enfants ou éviter d'utiliser getElementByIdetc.
par exemple
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
J'irai avec Node.childNodes :
Comme il fournit une forEachméthode lorsque je travaille avec window.IntersectionObserver
par exemple
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
Sur Chrome 83
Node.childNodes fournit
entries,forEach,item,keys,lengthetvaluesParentNode.children fournit
item,lengthetnamedItem