Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое DOM-дерево
DOM (Document Object Model) это программный интерфейс для взаимодействия с HTML и XML документами. DOM-дерево это иерархическое представление всех элементов на веб-странице в виде дерева объектов.
Что такое DOM-дерево - визуально
ЖДомен-дерево отображает структуру HTML документа:
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
</head>
<body>
<header>
<h1>Welcome</h1>
</header>
<main>
<div id="content">
<p>Hello World</p>
<button>Click me</button>
</div>
</main>
</body>
</html>
Это преобразуется в DOM-дерево:
document
|
html
/ \
head body
| / \
title header main
| | |
"My Page" h1 div#content
| / \
"Welcome" p button
| |
"Hello World" "Click me"
Основные типы узлов
1. Document - корень всего
// Документ - точка входа ко всему DOM
console.log(document); // Document объект
console.log(document.documentElement); // <html> элемент
console.log(document.body); // <body> элемент
2. Element Nodes - теги
// Елементы - это теги HTML
const div = document.querySelector('div');
console.log(div.nodeName); // 'DIV'
console.log(div.nodeType); // 1 (Element)
// У элементов есть свойства
div.className = 'container';
div.id = 'main';
div.style.color = 'red';
3. Text Nodes - текст
// Текст - это отдельные узлы
const p = document.querySelector('p');
console.log(p.childNodes); // содержит Text node
console.log(p.childNodes[0].nodeValue); // 'Hello World'
console.log(p.childNodes[0].nodeType); // 3 (Text)
4. Attribute Nodes - атрибуты
// Атрибуты (кроме как часть элемента)
const button = document.querySelector('button');
console.log(button.getAttribute('id')); // значение атрибута
console.log(button.attributes); // все атрибуты
5. Comment Nodes - комментарии
<!-- Это комментарий -->
// Комментарии тоже узлы
console.log(nodeType === 8); // Comment node
Навигация по DOM-дереву
Родитель (Parent)
const button = document.querySelector('button');
// parentNode - прямой родитель
console.log(button.parentNode); // <div id="content">
// parentElement - то же, но только элементы
console.log(button.parentElement); // <div id="content">
// Подняться выше
console.log(button.parentElement.parentElement); // <main>
Дети (Children)
const div = document.querySelector('div');
// childNodes - все дети (включая текстовые узлы)
console.log(div.childNodes); // NodeList [text, element, text, element]
// children - только элементы (быстрее)
console.log(div.children); // HTMLCollection [p, button]
// firstChild / lastChild - включают текстовые узлы
console.log(div.firstChild); // Может быть #text
// firstElementChild / lastElementChild - только элементы
console.log(div.firstElementChild); // <p>
console.log(div.lastElementChild); // <button>
Соседи (Siblings)
const button = document.querySelector('button');
// nextSibling - следующий (может быть #text)
console.log(button.nextSibling);
// nextElementSibling - следующий элемент
console.log(button.nextElementSibling);
// previousSibling / previousElementSibling
console.log(button.previousElementSibling); // <p>
Поиск элементов в DOM
1. getElementById (быстро)
const element = document.getElementById('content');
console.log(element); // <div id="content">
2. querySelector / querySelectorAll (мощно)
// Один элемент
const first = document.querySelector('.item');
const button = document.querySelector('button');
const main = document.querySelector('main > div');
// Все элементы
const items = document.querySelectorAll('.item');
console.log(items.length);
// Можно использовать любые CSS селекторы
const active = document.querySelectorAll('[data-active="true"]');
3. getElementsByClassName (живое)
// Динамический список (обновляется при изменении DOM)
const items = document.getElementsByClassName('item');
console.log(items.length); // 3
const newItem = document.createElement('div');
newItem.className = 'item';
document.body.appendChild(newItem);
console.log(items.length); // 4 - обновился автоматически!
4. getElementsByTagName
const buttons = document.getElementsByTagName('button');
const links = document.getElementsByTagName('a');
Изменение DOM-дерева
Добавление элементов
// Создать новый элемент
const newDiv = document.createElement('div');
newDiv.className = 'container';
newDiv.textContent = 'Hello!';
// Добавить в конец
document.body.appendChild(newDiv);
// Добавить в начало
document.body.insertBefore(newDiv, document.body.firstChild);
// Добавить в конкретное место
const parent = document.querySelector('.parent');
const sibling = document.querySelector('.sibling');
parent.insertBefore(newDiv, sibling);
Удаление элементов
const element = document.querySelector('#item');
// Удалить элемент
element.remove();
// Или через родителя (старый способ)
element.parentNode.removeChild(element);
Изменение содержимого
const paragraph = document.querySelector('p');
// Текст
paragraph.textContent = 'New text';
// HTML (опасно, если ненадежный источник)
paragraph.innerHTML = '<strong>Bold text</strong>';
// Более безопасно - работать с элементами
const strong = document.createElement('strong');
strong.textContent = 'Bold text';
paragraph.appendChild(strong);
Изменение атрибутов
const element = document.querySelector('input');
// Установить атрибут
element.setAttribute('type', 'password');
element.setAttribute('placeholder', 'Enter password');
// Или через свойства
element.id = 'password-input';
element.className = 'form-control';
// Получить атрибут
console.log(element.getAttribute('type')); // 'password'
// Проверить наличие
if (element.hasAttribute('disabled')) {
console.log('Disabled');
}
// Удалить атрибут
element.removeAttribute('disabled');
Работа с классами
const element = document.querySelector('.card');
// Добавить класс
element.classList.add('active');
// Удалить класс
element.classList.remove('active');
// Переключить класс
element.classList.toggle('active'); // Если есть, удалить; если нет - добавить
// Проверить наличие класса
if (element.classList.contains('active')) {
console.log('Element is active');
}
// Заменить класс
element.classList.replace('old-class', 'new-class');
Производительность: Live vs Static
// Live - обновляется автоматически (медленнее)
const liveList = document.getElementsByClassName('item');
// Static - снимок в момент времени (быстрее)
const staticList = document.querySelectorAll('.item');
// Пример
const items = document.getElementsByClassName('item'); // Live
console.log(items.length); // 10
// Добавить элемент
const newItem = document.createElement('div');
newItem.className = 'item';
document.body.appendChild(newItem);
console.log(items.length); // 11 - обновился!
Virtual DOM vs Real DOM
Real DOM (традиционный):
- Медленно обновлять (особенно большие дерева)
- Каждое изменение перерисовывает страницу
Virtual DOM (React, Vue):
- Виртуальное представление DOM
- Вычисляет минимальные изменения
- Одним пакетом обновляет Real DOM
- Намного быстрее
Итого
DOM-дерево это:
- Иерархическое представление всех элементов страницы
- Состоит из разных типов узлов (Elements, Text, Comments)
- Можно навигировать, искать и изменять через JavaScript
- Основа для взаимодействия с веб-страницей
- Modern фреймворки (React) манипулируют DOM через Virtual DOM для оптимизации