В чем разница между узлом и элементом в DOM? — Блог о самом интересном.

От создателя: объектная модель документа (DOM) — это интерфейс, который обрабатывает документ HTML либо XML как древовидную структуру, где любой узел является объектом документа. DOM также предоставляет набор способов для запроса дерева, конфигурации структуры и стиля.

В DOM также употребляется термин элемент: который весьма похож на узел. Итак, в чем разница между узлом DOM и элементом в DOM? Давайте выясним!

1. Узел DOM

Ключом к осознанию различия между узлом и элементом является осознание того, что такое узел. С наиболее высочайшей точки зрения, документ DOM состоит из иерархии узлов. Любой узел может иметь родителя и / либо потомков.

Давайте поглядим на последующий HTML-документ:

My Page

My Page

Thank you for visiting my web page!

1234567891011       My Page            

My Page

    

Thank you for visiting my web page!

  

Документ содержит последующую иерархию узлов:

это узел в дереве документа. У него есть 2 дочерних элемента: узлы и .

также является узлом, имеющим 3 дочерних элемента: комментарий , заголовок

и абзац

. Родителем узла является узел .

Теги в HTML-документе представляют собой узел, что любопытно, так это то, что обыденный текст также является узлом. Узел абзаца

имеет 1 дочерний элемент: текстовый узел «Спасибо, что посетили мою страницу!».

1.2 Типы узлов

Как отличить эти различные типы узлов? Ответ кроется в интерфейсе узла DOM, в особенности в свойстве Node.nodeType.
Node.nodeType может иметь одно из последующих значений, представляющих тип узла:

Сравнение и объяснение всех единиц измерения CSS

Node.ELEMENT_NODE

Node.ATTRIBUTE_NODE

Node.TEXT_NODE

Node.CDATA_SECTION_NODE

Node.PROCESSING_INSTRUCTION_NODE

Node.COMMENT_NODE

Node.DOCUMENT_NODE

Node.DOCUMENT_TYPE_NODE

Node.DOCUMENT_FRAGMENT_NODE

Node.NOTATION_NODE

Константы значимо указывают тип узла: к примеру, Node.ELEMENT_NODE представляет узел элемента, Node.TEXT_NODE представляет текстовый узел, Node.DOCUMENT_NODE узел документа и так дальше.

К примеру, выделим узел абзаца и поглядим на его свойство nodeType:

JavaScript const paragraph = document.querySelector(‘p’);

paragraph.nodeType === Node.ELEMENT_NODE; // => true

123 const paragraph = document.querySelector(‘p’); paragraph.nodeType === Node.ELEMENT_NODE; // => true

Как и ожидалось, paragraph.nodeType имеет значение Node.ELEMENT_NODE, указывающее, что абзац является элементом. Абзац также содержит текстовый узел:

JavaScript const paragraph = document.querySelector(‘p’);

const firstChild = paragraph.childNodes[0];

firstChild.nodeType === Node.TEXT_NODE; // => true

1234 const paragraph = document.querySelector(‘p’);const firstChild = paragraph.childNodes[0]; firstChild.nodeType === Node.TEXT_NODE; // => true

Существует тип узла, который представляет все дерево узлов документа — Node.DOCUMENT_NODE:

JavaScript document.nodeType === Node.DOCUMENT_NODE; // => true

1 document.nodeType === Node.DOCUMENT_NODE; // => true

2. Элемент DOM

Опосля того, как вы сообразили, что такое узел DOM, сейчас пора различать узел и элемент DOM.

Если вы освоите термин node, то ответ предельно ясен: элемент — это узел определенного типа — element (Node.ELEMENT_NODE). Вместе с таковыми типами, как документ, комментарий, текст и т.д.

Проще говоря, элемент — это узел, который записывается при помощи тега в документе HTML. , , , ,

,

все элементы, потому что они представлены тегами.

Тип документа, комментарий, текстовые узлы не являются элементами, поэтому что они не записаны с тегами:

Thank you for visiting my web page!

12345678       

      Thank you for visiting my web page!

  

Node является конструктором узла и HTMLElement конструктором элемента в JavaScript DOM. Абзац, будучи узлом и элементом, является экземпляром обоих Node и HTMLElement:

Облачный YouTube поможет Google избавиться от рекламной зависимости

JavaScript const paragraph = document.querySelector(‘p’);

paragraph instanceof Node; // => true
paragraph instanceof HTMLElement; // => true

1234 const paragraph = document.querySelector(‘p’); paragraph instanceof Node;        // => trueparagraph instanceof HTMLElement; // => true

Проще говоря, элемент — это подтип узла, так же как кошка — подтип звериного.

3. Характеристики модели DOM: узлы и элементы

Кроме различения узлов от частей, для вас также нужно различать характеристики DOM, которые содержат лишь узлы либо лишь элементы. Последующие характеристики типа Node оценивают узел либо группу узлов (NodeList):

JavaScript node.parentNode; // Node or null

node.firstChild; // Node or null
node.lastChild; // Node or null

node.childNodes; // NodeList

123456 node.parentNode; // Node or null node.firstChild; // Node or nullnode.lastChild;  // Node or null node.childNodes; // NodeList

Но последующие характеристики являются элементами либо группой частей (HTMLCollection):

JavaScript node.parentElement; // HTMLElement or null

node.children; // HTMLCollection

123 node.parentElement; // HTMLElement or null node.children;      // HTMLCollection

Так как оба node.childNodes и node.children возвращают перечень потомков, почему оба имеют эти характеристики? Неплохой вопросец! Разглядим последующий элемент абзаца, содержащий некий текст:

Thank you for visiting my web page!

123

  Thank you for visiting my web page!

Откройте демонстрацию, потом поглядите характеристики childNodes и children узла абзаца:

JavaScript const paragraph = document.querySelector(‘p’);

paragraph.childNodes; // NodeList: [HTMLElement, Text]
paragraph.children; // HTMLCollection: [HTMLElement]

1234 const paragraph = document.querySelector(‘p’); paragraph.childNodes; // NodeList:       [HTMLElement, Text]paragraph.children;   // HTMLCollection: [HTMLElement]

Группа paragraph.childNodes содержит 2 узла: полужирный элемент Спасибо,, также текстовый узел – что посетили мою страницу!

Но в группе paragraph.children всего 1 элемент: выделенный жирным шрифтом Спасибо,.

Так как paragraph.children содержит лишь элементы, текстовый узел не был включен сюда, поэтому что его тип — text (Node.TEXT_NODE), а не element (Node.ELEMENT_NODE).

Наличие обоих node.childNodes и node.children дозволяет для вас избрать группу дочерних частей, к которым вы желаете получить доступ: все дочерние узлы либо лишь дочерние элементы, являющиеся элементами.

4. Заключение

Документ DOM — это иерархический набор узлов. Любой узел может иметь родителя и / либо потомков. Осознать разницу между узлом DOM и элементом просто, если вы осознаете, что такое узел. У узлов есть типы, одним из которых является тип элемента. Элемент представлен тегом в документе HTML.

Тест: какой тип узла никогда не имеет родительского узла?

Создатель: Dmitri Pavlutin

Редакция: Команда webformyself.

Источник