предисловие
Эта статья является переводом, если есть какие-либо возражения, пожалуйста, предложите исправления, добро пожаловать на чтение.
автор:Ire Aderinokun
Оригинальный адрес:What, exactly, is the DOM?
текст
Объектная модель документа, или «DOM», представляет собой интерфейс к веб-странице. По сути, это API страницы, позволяющий программам читать и управлять содержимым, структурой и стилем страницы. Давайте сломаем это.
Как создавать веб-страницы?
То, как браузер переходит от исходного HTML-документа к отображению стилизованной интерактивной страницы в поле зрения, называется «критическим путем рендеринга». Хотя этот процесс можно разбить на несколько шагов, как я описал в своей статье «Понимание критического пути рендеринга», эти шаги можно условно разделить на две фазы. На первом этапе браузер анализирует документ, чтобы определить, что в конечном итоге отображать на странице, а на втором этапе браузер выполняет визуализацию.
Результатом первого этапа является то, что называется «деревом рендеринга». Дерево рендеринга — это представление элементов HTML и связанных с ними стилей, которые будут отображаться на странице. Чтобы построить это дерево, браузеру нужны две вещи:
- CSSOM, представление стилей, связанных с элементом
- DOM, представление элементов
Как создается DOM (и как он выглядит)?
DOM — это объектное представление исходного HTML-документа. Как мы увидим ниже, он имеет некоторые отличия, но по сути является попыткой преобразовать структуру и содержимое HTML-документа в объектную модель, которую могут использовать различные программы.
Объектная структура DOM представлена так называемым «деревом узлов». Он так называется, потому что его можно представить как дерево, у него есть единственный родительский ствол, и он может разветвляться на несколько подветвей, каждая из которых может иметь листья. В этом примере родительский «стебель» — это корневой элемент, дочерняя «ветвь» — это вложенный элемент, а «лист» — это содержимое внутри элемента.
Давайте возьмем этот HTML-документ в качестве примера:
<!doctype html>
<html lang="en">
<head>
<title>My first web page</title>
</head>
<body>
<h1>Hello, world!</h1>
<p>How are you?</p>
</body>
</html>
Этот документ можно представить в виде следующего дерева узлов:
Чем не является DOM?
В примере, который я привел выше, DOM выглядит как взаимно однозначное сопоставление исходного HTML-документа или DevTools, которые вы видите. Однако, как я уже говорил, есть некоторые отличия. Чтобы полностью понять, что такое DOM, нам нужно понять, чем он не является.
DOM не является исходным HTML
Хотя DOM создается из исходного HTML-документа, он не всегда одинаков. В обоих случаях DOM может отличаться от исходного HTML.
1. Когда HTML недействителен
DOM — это интерфейс к действительному HTML-документу. В процессе создания DOM браузер может исправить некоторые ошибки в HTML-коде.
Давайте возьмем этот HTML-документ в качестве примера:
<!doctype html>
<html>
Hello, world!
</html>
Документации не хватает<head>
и<body>
элемент, который является требованием для корректного HTML. Если мы посмотрим на результирующее DOM-дерево, то увидим, что это было исправлено:
2. Когда DOM модифицируется Javascript
Помимо интерфейса для просмотра содержимого HTML-документа, DOM можно изменить, чтобы сделать его активным ресурсом. Например, мы можем использовать Javascript для создания дополнительных узлов для DOM.
var newParagraph = document.createElement("p");
var paragraphContent = document.createTextNode("I'm new!");
newParagraph.appendChild(paragraphContent);
document.body.appendChild(newParagraph);
Это обновит DOM, но, конечно, не HTML-документ.
DOM — это не то, что вы видите в браузере (например, дерево рендеринга).
То, что вы видите в представлении браузера, — это дерево рендеринга, которое представляет собой комбинацию DOM и CSSOM, как упоминалось ранее. Настоящая разница между DOM и деревом рендеринга заключается в том, что последнее содержит только то, что в конечном итоге будет отрисовано на экране.
Поскольку дерево рендеринга фокусируется только на том, что визуализируется, оно исключает элементы, которые визуально скрыты. Например, сdisplay: none
Элемент, с которым связан стиль.
<!doctype html>
<html lang="en">
<head></head>
<body>
<h1>Hello, world!</h1>
<p style="display: none;">How are you?</p>
</body>
</html>
DOM будет содержать<p>
элемент:
Однако дерево рендеринга и то, что видно на виде, не будет содержать этот элемент.
DOM — это не DOM в DevTools
Разница невелика, так как инспектор элементов DevTools обеспечивает самое близкое приближение к DOM в браузере. Однако инспектор DevTools содержит дополнительную информацию, которой нет в DOM.
Лучший пример — псевдоэлементы CSS. использовать::before
и::after
Псевдоэлементы, созданные селекторами, являются частью CSSOM и дерева рендеринга, но технически не являются частью DOM. Это связано с тем, что DOM создается только из исходного документа HTML, исключая стили, применяемые к элементам.
Хотя псевдоэлементы не являются частью DOM, они находятся в нашем инспекторе элементов devtools.
Вот почему Javascript не может ориентироваться на псевдоэлементы, потому что они не являются частью DOM.
обзор
DOM — это интерфейс для HTML-документов. Браузеры используют его в качестве первого шага при принятии решения о том, что отображать в представлении, и изменяют содержимое, структуру или стиль страницы с помощью программы Javascript.
Хотя DOM похож на другие формы исходных HTML-документов, он во многом отличается:
- это всегда действительный HTML
- Это живая модель, которую можно изменить с помощью Javascript.
- Он не содержит псевдоэлементов (например,
::after
) - Он содержит скрытые элементы (например,
display: none
)