Files
obsidian/Веб/Фронтенд/DOM.md
T
roma-dxunvrs 6421fd3a48
deploy / Pull and Restart (push) Successful in 18s
21.09.26
2026-09-22 00:07:22 +03:00

44 lines
4.5 KiB
Markdown

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