DOM (Document Object Model)
Дерево объектов, в которое браузер превращает HTML-страницу: через него JavaScript читает и меняет содержимое страницы.
DOM (Document Object Model, объектная модель документа) — то, во что браузер превращает загруженную страницу. Каждый тег HTML становится объектом-узлом, вложенные теги — дочерними узлами, и вся страница оказывается деревом. JavaScript работает не с текстом HTML, а с этим деревом: находит узлы, меняет их, добавляет и удаляет — и браузер сразу показывает изменения на экране.
Как выглядит дерево
Для разметки
<!-- HTML -->
<ul id="orders">
<li>Заказ 101</li>
<li>Заказ 102</li>
</ul>
браузер построит узел списка с двумя дочерними узлами-пунктами, а внутри каждого пункта — текстовый узел. Корень всего дерева — объект document.
Как с ним работают
// JavaScript
const list = document.querySelector("#orders");
const item = document.createElement("li");
item.textContent = "Заказ 103";
list.append(item);
Код находит список, создает новый пункт и добавляет его в конец — на странице сразу появляется третий заказ. Так же DOM подписывается на события: нажатие, ввод текста, прокрутку.
Почему изменения DOM бывают дорогими
После изменения дерева браузер может пересчитать расположение элементов (reflow) и перерисовать их (repaint). Если менять DOM в цикле по одному элементу, страница начинает тормозить. Поэтому изменения группируют, а библиотеки вроде React сначала вычисляют, что именно изменилось, и вносят в DOM минимум правок. Обход дерева, кстати, — классический пример рекурсии: у каждого узла есть дочерние узлы со своими дочерними.
DOM и доступность
Из DOM браузер строит еще и дерево доступности, которое читают программы экранного доступа для незрячих людей. Поэтому правильные теги важны: настоящая кнопка button будет объявлена как кнопка и сработает с клавиатуры, а «кнопка» из обычного блока с обработчиком нажатия — нет.
Чем DOM не является
DOM — не исходный HTML-файл: если скрипт изменил страницу, «Просмотр кода страницы» покажет исходный HTML, а инструменты разработчика — текущее дерево DOM. И DOM — не только про браузер: тот же стандарт используется для работы с XML-документами в программах на разных языках.