Réponses:
Comprenez que .children
c'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, .childNodes
est une propriété de Node . .childNodes
peut 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 .children
parce 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 .textContent
place. 4
1. Techniquement, c'est un attribut de ParentNode , un mixin inclus par Element.
2. Ce sont tous des éléments car il .children
s'agit d'une HTMLCollection , qui ne peut contenir que des éléments.
3. De même, .childNodes
peut contenir n'importe quel nœud car il s'agit d'une NodeList .
4. Ou .innerText
. Voir les différences ici ou ici .
.children
sur les documents XML : jsfiddle.net/fbwbjvch/1
Element.children
renvoie uniquement les enfants des éléments , tandis que Node.childNodes
renvoie 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 childNodes
c'est plus fiable. Par exemple, MDC (lié ci-dessus) note qu'IE ne fonctionne que children
dans IE 9. childNodes
offre moins de marge d'erreur aux implémenteurs de navigateur.
.children
il ne filtre pas les nœuds de commentaire, mais il filtre les nœuds de texte.
.getElementsByTagName('*')
. IE peut être si ennuyeux parfois ...
children
qui 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 namedItem
méthode qui me permet d'obtenir directement l'un des éléments enfants sans parcourir tous les enfants ou éviter d'utiliser getElementById
etc.
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 forEach
mé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
,length
etvalues
ParentNode.children fournit
item
,length
etnamedItem