В этом руководстве вы узнаете об объектной модели документа — 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-документ:
В этом дереве DOM документ является корневым узлом. Корневой узел имеет один дочерний узел, который является элементом <html>
. Элемент <html>
называется элементом документа.
Каждый документ может иметь только один элемент document
. В документе HTML элемент document
является элементом <html>
. Каждая разметка может быть представлена узлом в дереве.
Типы узлов
Каждый узел в дереве DOM идентифицируется типом узла. JavaScript использует целые числа для определения типов узлов. В следующей таблице показаны константы типа узла:
Постоянный | Ценность | Описание |
---|---|---|
Node.ELEMENT_NODE | 1 | Element , такой как <p> или <div> . |
Node.TEXT_NODE | 3 | Фактический Text внутри Element или Attr . |
Node.CDATA_SECTION_NODE | 4 | CDATASection , например <!CDATA[[ … ]]> . |
Node.PROCESSING_INSTRUCTION_NODE | 7 | ProcessingInstruction XML-документа, например <?xml-stylesheet … ?> . |
Node.COMMENT_NODE | 8 | Узел Comment , такой как <!-- … --> . |
Node.DOCUMENT_NODE | 9 | Узел Document . |
Node.DOCUMENT_TYPE_NODE | 10 | Узел DocumentType , такой как <!DOCTYPE html> . |
Node.DOCUMENT_FRAGMENT_NODE | 11 | Узел 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
:
Обратите внимание, что getElementById() и querySelector() возвращают объект с типом Element, а getElementsByTagName() или querySelectorAll() возвращают NodeList, который представляет собой набор узлов.
Отношения узлов
Любой узел имеет отношения к другим узлам дерева DOM. Отношения такие же, как те, которые описаны в традиционном генеалогическом древе.
Например, <body>
является дочерним узлом узла <html>
, а <html>
является родителем узла <body>
.
Узел <body>
является одноуровневым по отношению к узлу <head>
поскольку они имеют одного и того же непосредственного родителя, которым является элемент <html>
.
На следующем рисунке показаны отношения между узлами:
Заключение
- Документ HTML или XML может быть представлен в виде дерева узлов, как традиционное генеалогическое древо.
- Каждая разметка может быть представлена как узел с определенным типом узла.
- Элемент — это особый тип узла с типом узла
Node.ELEMENT_NODE
. - В дереве DOM узел имеет отношения с другими узлами.