Jawaban:
Memahami bahwa itu .children
adalah properti dari Elemen . 1 Hanya Elemen yang dimiliki .children
, dan anak-anak ini semuanya tipe Element. 2
Namun, .childNodes
adalah milik Node . .childNodes
dapat berisi simpul apa saja. 3
Contoh nyata adalah:
let el = document.createElement("div");
el.textContent = "foo";
el.childNodes.length === 1; // Contains a Text node child.
el.children.length === 0; // No Element children.
Sebagian besar waktu, Anda ingin menggunakan .children
karena umumnya Anda tidak ingin mengulang simpul Teks atau Komentar dalam manipulasi DOM Anda.
Jika Anda ingin memanipulasi simpul teks, Anda mungkin menginginkannya .textContent
. 4
1. Secara teknis, ini adalah atribut ParentNode , mixin yang disertakan oleh Elemen.
2. Mereka semua elemen karena .children
merupakan HTMLCollection , yang hanya dapat berisi elemen.
3. Demikian pula, .childNodes
dapat menampung simpul apa pun karena itu adalah NodeList .
4. Atau .innerText
. Lihat perbedaannya di sini atau di sini .
.children
pada dokumen XML : jsfiddle.net/fbwbjvch/1
Element.children
mengembalikan hanya elemen anak-anak, sementara Node.childNodes
mengembalikan semua simpul anak . Perhatikan bahwa elemen adalah simpul, sehingga keduanya tersedia pada elemen.
Saya percaya childNodes
lebih dapat diandalkan. Sebagai contoh, MDC (ditautkan di atas) mencatat bahwa IE hanya children
benar di IE 9. childNodes
menyediakan lebih sedikit ruang untuk kesalahan oleh pelaksana browser.
.children
tidak memfilter node komentar, tetapi memfilter node teks.
.getElementsByTagName('*')
. IE kadang-kadang bisa sangat menyebalkan ...
children
yang mendukung IE.
Jawaban yang bagus sejauh ini, saya hanya ingin menambahkan bahwa Anda dapat memeriksa jenis simpul menggunakan nodeType
:
yourElement.nodeType
Ini akan memberi Anda bilangan bulat: (diambil dari sini )
| 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. | |
Perhatikan bahwa menurut Mozilla :
Konstanta berikut telah ditinggalkan dan tidak boleh digunakan lagi: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Saya akan pergi dengan ParentNode.children :
Karena ia menyediakan namedItem
metode yang memungkinkan saya secara langsung untuk mendapatkan salah satu elemen anak-anak tanpa melalui semua anak atau menghindari penggunaan getElementById
dll.
misalnya
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Saya akan menggunakan Node.childNodes :
Karena menyediakan forEach
metode ketika saya bekerja dengan window.IntersectionObserver
misalnya
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
Di Chrome 83
Node.childNodes menyediakan
entries
,forEach
,item
,keys
,length
danvalues
ParentNode.children menyediakan
item
,length
dannamedItem