Antworten:
Verstehen Sie, dass dies .children
eine Eigenschaft eines Elements ist . 1 Nur Elemente haben .children
, und diese Kinder sind alle vom Typ Element. 2
Ist .childNodes
jedoch eine Eigenschaft von Node . .childNodes
kann einen beliebigen Knoten enthalten. 3
Ein konkretes Beispiel wäre:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
Meistens möchten Sie verwenden, .children
da Sie bei Ihrer DOM-Manipulation im Allgemeinen keine Text- oder Kommentarknoten durchlaufen möchten .
Wenn Sie Textknoten bearbeiten möchten, möchten Sie wahrscheinlich .textContent
stattdessen. 4
1. Technisch gesehen ist es ein Attribut von ParentNode , einem von Element enthaltenen Mixin.
2. Sie sind alle Elemente, da .children
es sich um eine HTMLCollection handelt , die nur Elemente enthalten kann.
3. .childNodes
Kann in ähnlicher Weise jeden Knoten enthalten, da es sich um eine NodeList handelt .
4. Oder .innerText
. Sehen Sie die Unterschiede hier oder hier .
.children
: jsfiddle.net/fbwbjvch/1
Element.children
Gibt nur untergeordnete Elemente zurück , während Node.childNodes
alle untergeordneten Knoten zurückgegeben werden . Beachten Sie, dass Elemente Knoten sind, sodass beide für Elemente verfügbar sind.
Ich glaube childNodes
ist zuverlässiger. Beispielsweise stellt MDC (oben verlinkt) fest, dass der IE nur children
in IE 9 richtig funktioniert hat. childNodes
Browser-Implementierer bieten weniger Fehler.
.children
keine Kommentarknoten heraus, aber es filtert Textknoten heraus.
.getElementsByTagName('*')
. IE kann manchmal so nervig sein ...
children
, die IE unterstützen.
Bisher gute Antworten, ich möchte nur hinzufügen, dass Sie den Typ eines Knotens überprüfen können, indem Sie nodeType
:
yourElement.nodeType
Dies gibt Ihnen eine ganze Zahl: (von hier genommen )
| 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. | |
Beachten Sie, dass laut Mozilla :
Die folgenden Konstanten sind veraltet und sollten nicht mehr verwendet werden: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Ich werde mit ParentNode.children gehen :
Da es eine namedItem
Methode bietet , mit der ich eines der untergeordneten Elemente direkt abrufen kann, ohne alle untergeordneten Elemente zu durchlaufen oder die Verwendung getElementById
usw. zu vermeiden .
z.B
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Ich werde mit Node.childNodes gehen :
Da es forEach
Methode bietet , wenn ich window.IntersectionObserver
zB arbeite
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
Auf Chrome 83
Node.childNodes bietet
entries
,forEach
,item
,keys
,length
undvalues
ParentNode.children bietet
item
,length
undnamedItem