4.5 KiB
4.5 KiB
- Document Object Model
- Это платформо-независимый интерфейс, позволяющий программам и скриптам получить доступ к содержимому HTML-документов
- Стандартизована W3C (World Wide Web Consortium)
- Документ в DOM представляет собой дерево узлов
- Узлы связаны между собой отношением родитель-потомок
- Используется для динамического изменения страниц HTML
- Генерируется браузером, браузер получил html с сервера и строит по нему дерево в ОЗУ. JS скрипты меняют содержимое DOM в оперативке (именно поэтому при нажатии F5 все сбрасывается)
- Также браузер может менять и CSS-стили - для них создается CSSOM (CSS Object Model) - F12 и просмотр кода элемента ровно это и делают
- Точка входа - объект
document(на самом делеwindow.document)
Манипуляции через JavaScript
- получение узлов:
document.all("image1").outerHTML; - изменение узлов
- изменение связей между узлами
- удаление узлов
Иерархия объектов DOM под капотом
EventTarget- базовый класс, дающий возможность вешать событияaddEventListenerNode- узел дерева, узлами бывают не только теги, но и просто куски текста или комментарииElement- узел-тег, у которого есть атрибутыHTMLElement- базовый класс для HTML-тегов- Конкретные классы:
HTMLInputElement,HTMLButtonEvent
API для изменения
Поиск элементов
- Современный стандарт
document.querySelector('.class #id') - ищет первый попавшийся по CSS-селектору document.querySelectorAll- возвращает коллекциюNodeListgetElementById,getElementsByClassName- быстрее, но синтаксис хуже - легаси
Изменение содержимого и стилей
element.textContent = "Текст"- вставляет текстelement.innerHTML = "<b>Текст</b>"- вставляет HTMLelement.style.backgroundColor = "red"- инлайн-стилиelement.classList.add("active")- добавить CSS-класс
Создание и удаление
const btn = document.createElement('button'); // Создали объект в памяти (он еще не на экране!)
btn.textContent = "Нажми меня";
document.body.append(btn); // Физически вставили в DOM (на экран)
btn.remove(); // Удалили
Reflow и Repaint
- Reflow (Перекомпоновка): Происходит, если JS меняет геометрию (ширину, высоту, добавляет/удаляет элемент). Браузеру приходится заново пересчитывать Layout для всего дерева. Это очень медленно и грузит процессор.
- Repaint (Перерисовка): Происходит, если JS меняет только внешний вид (цвет фона, цвет текста). Браузер просто перекрашивает пиксели. Это быстро.
[!note] Индустрия Именно из-за проблемы медленного Reflow при прямых манипуляциях с DOM, Facebook в 2013 году придумал React и концепцию Virtual DOM. React собирает все изменения в "виртуальном" черновом дереве в ОЗУ, сравнивает их, и вносит в реальный DOM только одну математически идеальную минимальную правку, чтобы не вызывать лишних Reflow.
События и всплытие
- Подключение
element.addEventListener("click", (event) => {...}). Объектeventхранит всю информацию о нажатии