Понимание объектной модели документа (DOM) в JavaScript

В этом руководстве вы узнаете об объектной модели документа — Document Object Model (DOM) в JavaScript.

Document Object Model — это интерфейс прикладного программирования (API) для управления HTML-документами.

DOM представляет HTML-документ в виде дерева узлов и предоставляет функции, позволяющие эффективно добавлять, удалять и изменять части документа.

Обратите внимание, что DOM — это кроссплатформенный и независимый от языка способ управления документами HTML и XML.

Документ как иерархия узлов

DOM представляет документ HTML как иерархию узлов. Рассмотрим следующий HTML-документ:

<html>
    <head>
        <title>JavaScript DOM</title>
    </head>
    <body>
        <p>Hello DOM!</p>
    </body>
</html>

Следующее дерево представляет вышеуказанный HTML-документ:

JavaScript DOM

В этом дереве DOM документ является корневым узлом. Корневой узел имеет один дочерний узел, который является элементом <html>. Элемент <html> называется элементом документа.

Каждый документ может иметь только один элемент document. В документе HTML элемент document является элементом <html>. Каждая разметка может быть представлена узлом в дереве.

Типы узлов

Каждый узел в дереве DOM идентифицируется типом узла. JavaScript использует целые числа для определения типов узлов. В следующей таблице показаны константы типа узла:

ПостоянныйЦенностьОписание
Node.ELEMENT_NODE1Element, такой как <p> или <div>.
Node.TEXT_NODE3Фактический Text внутри Element или Attr.
Node.CDATA_SECTION_NODE4CDATASection, например <!CDATA[[ … ]]>.
Node.PROCESSING_INSTRUCTION_NODE7ProcessingInstruction XML-документа, например <?xml-stylesheet … ?>.
Node.COMMENT_NODE8Узел Comment, такой как <!-- … -->.
Node.DOCUMENT_NODE9Узел Document.
Node.DOCUMENT_TYPE_NODE10Узел DocumentType, такой как <!DOCTYPE html>.
Node.DOCUMENT_FRAGMENT_NODE11Узел DocumentFragment.

Чтобы получить тип узла, используйте свойство nodeType :

node.nodeType

Вы можете сравнить свойство nodeType с приведенными выше константами, чтобы определить тип узла. Например:

if(node.nodeType == Node.ELEMENT_NODE) {
    // node is the element node
}

Свойства nodeName и nodeValue

У узла есть два важных свойства: nodeName и nodeValue, которые предоставляют конкретную информацию об узле.

Значения этих свойств зависят от типа узла. Например, если типом узла является узел элемента, nodeName всегда совпадает с именем тега элемента, а nodeValue всегда null.

По этой причине лучше проверить тип узла перед использованием этих свойств:

if(node.nodeType == Node.ELEMENT_NODE) {
    let name = node.nodeName; // tag name like <p>
}

Узел и элемент

Иногда легко спутать Node и Element.

Узел — это общее имя любого объекта в дереве DOM. Это может быть любой встроенный элемент DOM, например документ. Или это может быть любой тег HTML, указанный в документе HTML, например <div> или <p>.

Элемент — это узел с определенным типом узла Node.ELEMENT_NODE, который равен 1.

Другими словами, узел является универсальным типом элемента. Элемент представляет собой определенный тип узла с типом узла Node.ELEMENT_NODE.

На следующем рисунке показана взаимосвязь между Node и Element :

Объектная модель документа в JavaScript

Обратите внимание, что getElementById() и querySelector() возвращают объект с типом Element, а getElementsByTagName() или querySelectorAll() возвращают NodeList, который представляет собой набор узлов.

Отношения узлов

Любой узел имеет отношения к другим узлам дерева DOM. Отношения такие же, как те, которые описаны в традиционном генеалогическом древе.

Например, <body> является дочерним узлом узла <html>, а <html> является родителем узла <body>.

Узел <body> является одноуровневым по отношению к узлу <head> поскольку они имеют одного и того же непосредственного родителя, которым является элемент <html>.

На следующем рисунке показаны отношения между узлами:

Отношения узла JavaScript DOM

Заключение

  • Документ HTML или XML может быть представлен в виде дерева узлов, как традиционное генеалогическое древо.
  • Каждая разметка может быть представлена как узел с определенным типом узла.
  • Элемент — это особый тип узла с типом узла Node.ELEMENT_NODE.
  • В дереве DOM узел имеет отношения с другими узлами.
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript