Odpowiedzi:
Zrozum, że .children
jest to właściwość elementu . 1 Tylko elementy mają .children
, a wszystkie te elementy potomne są typu elementu. 2)
Jednak .childNodes
jest własnością węzła . .childNodes
może zawierać dowolny węzeł. 3)
Konkretnym przykładem byłoby:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
.children
Przez większość czasu chcesz używać, ponieważ generalnie nie chcesz zapętlać węzłów Tekst lub Komentarz podczas manipulacji DOM.
Jeśli chcesz manipulować węzłami tekstowymi, prawdopodobnie .textContent
zamiast tego chcesz . 4
1. Z technicznego punktu widzenia jest to atrybut ParentNode , miksu zawartego w elemencie.
2. Wszystkie są elementami, ponieważ .children
jest to kolekcja HTMLC , która może zawierać tylko elementy.
3. Podobnie .childNodes
może pomieścić dowolny węzeł, ponieważ jest to lista NodeList .
4. Or .innerText
. Zobacz różnice tutaj lub tutaj .
.children
dokumentów XML : jsfiddle.net/fbwbjvch/1
Element.children
zwraca tylko elementy potomne elementu , a Node.childNodes
zwraca wszystkie elementy potomne węzła . Zauważ, że elementy są węzłami, więc oba są dostępne na elementach.
Wierzę, że childNodes
jest bardziej niezawodny. Na przykład MDC (link powyżej) zauważa, że IE ma children
rację tylko w IE 9. childNodes
zapewnia mniej miejsca na błędy dla implementatorów przeglądarki.
.children
nie odfiltrowuje węzłów komentarzy, ale odfiltrowuje węzły tekstowe.
.getElementsByTagName('*')
. Czasami IE może być tak denerwujące ...
children
tego wsparcia IE.
Dobre odpowiedzi do tej pory, chcę tylko dodać, że można sprawdzić typ węzła za pomocą nodeType
:
yourElement.nodeType
To da ci liczbę całkowitą: (wzięte stąd )
| 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. | |
Zauważ, że według Mozilli :
Następujące stałe są przestarzałe i nie powinny być już używane: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Pójdę z ParentNode.children :
Ponieważ zapewnia namedItem
metodę, która pozwala mi bezpośrednio uzyskać jeden z elementów potomnych bez zapętlania wszystkich dzieci lub unikania używania getElementById
itp.
na przykład
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Pójdę z Node.childNodes :
Ponieważ zapewnia forEach
metodę, gdy pracuję z window.IntersectionObserver
np
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
W Chrome 83
Node.childNodes zapewnia
entries
,forEach
,item
,keys
,length
ivalues
ParentNode.children zapewnia
item
,length
inamedItem