Ответы:
Поймите, что .children
это свойство элемента . 1 Только элементы имеют .children
, и все эти потомки имеют тип элемента. 2
Тем не менее, .childNodes
является собственностью узла . .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
потому что обычно вы не хотите зацикливаться на узлах Text или Comment при манипуляциях с 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