Antworten:
Verstehen Sie, dass dies .childreneine Eigenschaft eines Elements ist . 1 Nur Elemente haben .children, und diese Kinder sind alle vom Typ Element. 2
Ist .childNodesjedoch eine Eigenschaft von Node . .childNodeskann 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, .childrenda Sie bei Ihrer DOM-Manipulation im Allgemeinen keine Text- oder Kommentarknoten durchlaufen möchten .
Wenn Sie Textknoten bearbeiten möchten, möchten Sie wahrscheinlich .textContentstattdessen. 4
1. Technisch gesehen ist es ein Attribut von ParentNode , einem von Element enthaltenen Mixin.
2. Sie sind alle Elemente, da .childrenes sich um eine HTMLCollection handelt , die nur Elemente enthalten kann.
3. .childNodesKann 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.childrenGibt nur untergeordnete Elemente zurück , während Node.childNodesalle untergeordneten Knoten zurückgegeben werden . Beachten Sie, dass Elemente Knoten sind, sodass beide für Elemente verfügbar sind.
Ich glaube childNodesist zuverlässiger. Beispielsweise stellt MDC (oben verlinkt) fest, dass der IE nur childrenin IE 9 richtig funktioniert hat. childNodesBrowser-Implementierer bieten weniger Fehler.
.childrenkeine 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 namedItemMethode bietet , mit der ich eines der untergeordneten Elemente direkt abrufen kann, ohne alle untergeordneten Elemente zu durchlaufen oder die Verwendung getElementByIdusw. 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 forEachMethode 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,lengthundvaluesParentNode.children bietet
item,lengthundnamedItem