В чем разница между дочерними и дочерними узлами в JavaScript? - PullRequest
263 голосов
/ 29 октября 2011

Я обнаружил, что использую JavaScript, и натолкнулся на свойства childNodes и children.Мне интересно, в чем разница между ними.Также один предпочтительнее другого?

Ответы [ 3 ]

273 голосов
/ 29 октября 2011

.children является собственностью элемента . Только у Элементов есть дочерние элементы, и все эти дети имеют тип Элемент.

Однако .childNodes является собственностью Node . .childNodes может содержать любой узел.

Таким образом, конкретный пример будет

var el = document.createElement("div");
el.textContent = "foo"
el.childNodes.length === 1; // TextNode is a node child
el.children.length === 0; // no Element children

Конечно, .children - это DOM4, поэтому поддержка браузера шатка, однако если вы используете DOM-shim , ваши проблемы с кросс-браузером исчезнут!

Большую часть времени вы хотите использовать .children, потому что обычно вы не хотите зацикливаться на TextNodes или комментариях при манипуляциях с DOM.

Если вы хотите манипулировать текстовыми узлами, вы, вероятно, хотите вместо этого .textContent.

18 голосов
/ 29 октября 2011

Element.children возвращает только дочерние элементы, тогда как Node.childNodes возвращает все дочерние узлы.Обратите внимание, что элементы являются узлами, поэтому оба элемента доступны для элементов.

Я считаю, childNodes более надежно.Например, MDC (ссылка выше) отмечает, что IE получил только children прямо в IE 9. childNodes предоставляет меньше места для ошибок разработчикам браузера.

5 голосов
/ 26 августа 2018

Хорошие ответы пока, я хочу только добавить, что вы можете проверить тип узла, используя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...