DOM (Document Object Model) — это мост между вашим JavaScript и HTML. Без него вы не сможете ни прочитать данные со страницы, ни изменить их. Если вы хотите оживить сайт, сделать его интерактивным, то без работы с DOM не обойтись. В этой статье мы разберём всё по полочкам: как находить элементы, менять их, создавать новые и удалять старые. Будет много примеров и практических советов.

Digital-студия WNDER

Что такое DOM и с чем его едят

Представьте, что HTML-страница — это генеалогическое древо. Каждый тег — это родственник: у кого-то есть родители, дети, братья и сёстры. DOM — это то же самое дерево, только построенное браузером после загрузки страницы. JavaScript может лазить по этому дереву, находить нужные узлы и манипулировать ими.

Каждый элемент — это объект. У него есть свойства (например, textContent, style, classList) и методы (например, appendChild, remove, addEventListener). Всё это доступно через глобальный объект document.

Вот простой пример: как получить доступ к телу документа.

const body = document.body;
console.log(body); // выведет ...

Но это только начало. Давайте копнём глубже.

Как найти элементы на странице

Первое, что вам понадобится — это умение находить нужные элементы. Есть несколько способов, и у каждого свои особенности.

  • getElementById — ищет по уникальному id. Быстро, но id должен быть уникальным.
  • getElementsByClassName — возвращает живую коллекцию элементов с указанным классом.
  • getElementsByTagName — ищет по имени тега (например, 'div').
  • querySelector — возвращает первый элемент, подходящий под CSS-селектор.
  • querySelectorAll — возвращает статическую коллекцию всех подходящих элементов.

Самые популярные сегодня — querySelector и querySelectorAll. Они гибкие, потому что используют CSS-селекторы. Например:

// Найти первый параграф с классом 'intro'
const intro = document.querySelector('p.intro');

// Найти все элементы с классом 'item'
const items = document.querySelectorAll('.item');

Обратите внимание: querySelectorAll возвращает не массив, а NodeList. Его можно перебирать через forEach, но некоторые методы массива (например, map) недоступны. Если нужен массив, используйте Array.from() или spread-оператор.

Правило: Всегда используйте querySelector и querySelectorAll для сложных селекторов, но для простых id или классов лучше подходят getElementById и getElementsByClassName — они работают быстрее.

Манипуляции с элементами: создаём, меняем, удаляем

Найти элемент — это полдела. Настоящая магия начинается, когда вы начинаете его менять.

Создать новый элемент просто:

const newDiv = document.createElement('div');
newDiv.textContent = 'Привет, мир!';
newDiv.classList.add('my-class');

Теперь его нужно куда-то вставить. Для этого есть несколько методов:

  • appendChild — добавляет элемент как последнего ребёнка.
  • insertBefore — вставляет перед указанным элементом.
  • append, prepend, before, after — более современные методы, позволяющие вставлять элементы и строки.

Пример:

const container = document.querySelector('.container');
container.appendChild(newDiv);

Чтобы изменить содержимое элемента, используйте textContent (для текста) или innerHTML (для HTML-разметки). Но будьте осторожны с innerHTML: он может стать дырой в безопасности, если вставляете данные от пользователя.

Удалить элемент можно методом remove():

newDiv.remove();

Или через родителя: parent.removeChild(child).

Вот таблица с основными методами для манипуляции:

Метод Описание
createElementСоздаёт новый элемент
appendChildДобавляет элемент в конец родителя
insertBeforeВставляет перед указанным элементом
removeУдаляет элемент из DOM
replaceWithЗаменяет элемент другим

Стили и классы: как менять внешний вид

Внешний вид элемента управляется через атрибут style или через классы. Работать с классами удобнее, потому что стили хранятся в CSS, а не в JS.

У каждого элемента есть свойство classList. Оно предоставляет методы:

  • add — добавить класс
  • remove — удалить класс
  • toggle — переключить класс
  • contains — проверить наличие класса

Пример:

const btn = document.querySelector('.btn');
btn.classList.add('active');
btn.classList.toggle('hidden');

Если нужно изменить стиль напрямую, используйте style:

btn.style.backgroundColor = 'blue';
btn.style.color = 'white';

Но помните: инлайн-стили имеют высокую специфичность, и их сложно переопределить. Лучше использовать классы.

Лайфхак: Чтобы добавить несколько классов сразу, используйте classList.add('class1', 'class2'). А для удаления — classList.remove('class1', 'class2').

События: делаем страницу интерактивной

DOM не был бы таким мощным без событий. События позволяют реагировать на действия пользователя: клики, наведение, ввод с клавиатуры и многое другое.

Самый распространённый способ подписки на событие — addEventListener:

const button = document.querySelector('button');
button.addEventListener('click', function(event) {
  alert('Кнопка нажата!');
});

У события есть объект event, который содержит информацию о том, что произошло. Например, event.target — это элемент, на котором произошло событие.

Вот основные типы событий, которые вы будете использовать чаще всего:

Событие Когда срабатывает
clickКлик мышью по элементу
mouseover / mouseoutНаведение / уход курсора
keydown / keyupНажатие / отпускание клавиши
submitОтправка формы
DOMContentLoadedЗагрузка и построение DOM

Важно: если вы добавляете обработчик к элементу, который ещё не существует в DOM, он не сработает. Дождитесь загрузки страницы или используйте делегирование событий.

Делегирование — это приём, когда обработчик вешается на родителя, а затем проверяется event.target. Это позволяет работать с динамически добавляемыми элементами.

document.querySelector('.list').addEventListener('click', function(event) {
  if (event.target.tagName === 'LI') {
    console.log('Клик по элементу списка:', event.target.textContent);
  }
});

Практические советы и типичные ошибки

Даже опытные разработчики иногда наступают на грабли. Вот несколько советов, которые сэкономят вам время и нервы.

  • Не забывайте про производительность. Частые изменения DOM могут замедлить страницу. Если нужно добавить много элементов, создайте их в фрагменте (DocumentFragment) и вставьте один раз.
  • Используйте делегирование событий для списков и динамических элементов.
  • Проверяйте существование элемента перед манипуляцией, чтобы избежать ошибок null.
  • Кэшируйте ссылки на элементы, если обращаетесь к ним многократно.

Пример использования DocumentFragment:

const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
  const li = document.createElement('li');
  li.textContent = `Элемент ${i}`;
  fragment.appendChild(li);
}
document.querySelector('ul').appendChild(fragment);
Правило: Всегда минимизируйте количество обращений к DOM. Каждое изменение вызывает перерисовку (reflow) и перекомпоновку (repaint), что может быть дорого.

Ещё одна частая ошибка — использование innerHTML для вставки пользовательских данных. Это может привести к XSS-атакам. Используйте textContent или создавайте элементы через createElement.

Что в итоге

Работа с DOM — это базовый навык для любого веб-разработчика. Вы научились находить элементы, создавать и удалять их, менять стили и обрабатывать события. Помните о производительности и безопасности. Практикуйтесь, и вы станете настоящим мастером манипуляций с DOM.

Главное — не бойтесь экспериментировать. Откройте консоль браузера и попробуйте что-нибудь сделать с текущей страницей. Это лучший способ закрепить материал.

Студия WNDER