Відповіді:
Зрозумійте, що .children
це властивість елемента . 1 Є лише Елементи .children
, і всі ці діти - Елемент типу. 2
Однак .childNodes
це властивість Node . .childNodes
може містити будь-який вузол. 3
Конкретним прикладом може бути:
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
тому що, як правило, ви не хочете перебирати вузли Текст чи коментар під час маніпуляції з DOM.
Якщо ви хочете маніпулювати текстовими вузлами, ви, мабуть, хочете .textContent
замість цього. 4
1. Технічно це атрибут ParentNode , міксину , включеного Element.
2. Всі вони є елементами, оскільки .children
це HTMLCollection , який може містити лише елементи.
3. Аналогічно, .childNodes
може містити будь-який вузол, оскільки це NodeList .
4. Або .innerText
. Дивіться відмінності тут або тут .
.children
документи XML : jsfiddle.net/fbwbjvch/1
Element.children
повертає лише дітей- елементів , тоді як Node.childNodes
повертає всіх дітей- вузлів . Зауважте, що елементи - це вузли, тому обидва доступні для елементів.
Я вважаю, childNodes
це надійніше. Наприклад, MDC (пов'язаний вище) зазначає, що IE отримав тількиchildren
право в IE 9. childNodes
надає менше можливостей для помилок з боку браузерних реалізаторів.
.children
, не фільтрує вузли коментарів, але він фільтрує текстові вузли.
.getElementsByTagName('*')
. IE може бути настільки дратівливим часом ...
children
що підтримує IE.
Хороші відповіді поки що, хочу лише додати, що ви можете перевірити тип вузла, використовуючи nodeType
:
yourElement.nodeType
Це дасть вам ціле число: (взято звідси )
| 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. | |
Зауважте, що згідно Mozilla :
Наступні константи застаріли і більше не повинні використовуватися: Node.ATTRIBUTE_NODE, Node.ENTITY_REFERENCE_NODE, Node.ENTITY_NODE, Node.NOTATION_NODE
Я піду з ParentNode.children :
Оскільки він пропонує namedItem
метод, який дозволяє мені безпосередньо отримати один із дочірніх елементів, не переглядаючи всіх дітей або уникаючи використанняgetElementById
тощо.
напр
ParentNode.children.namedItem('ChildElement-ID'); // JS
ref.current.children.namedItem('ChildElement-ID'); // React
this.$refs.ref.children.namedItem('ChildElement-ID'); // Vue
Я піду з Node.childNodes :
Оскільки це забезпечує forEach
метод, коли я працюю, window.IntersectionObserver
наприклад
nodeList.forEach((node) => { observer.observe(node) })
// IE11 does not support forEach on nodeList, but easy to be polyfilled.
На Chrome 83
Node.childNodes забезпечує
entries
,forEach
,item
,keys
,length
іvalues
ParentNode.children забезпечує
item
,length
іnamedItem