1. Поиск элементов и изменение DOM-дерева
Приветствую на интенсивном курсе по Frontend-разработке! Вы уже знаете базовый синтаксис JavaScript, поэтому мы пропустим переменные и циклы, и сразу перейдем к тому, что делает веб-страницы живыми.
Как опытный ментор, я составил для вас пошаговый план на ближайший месяц. Наша цель — научиться связывать логику JavaScript с визуальной частью сайта и сохранять данные пользователя.
Интенсивный план обучения на 5 недель
querySelector, textContent, innerHTML и classList. Практика: создание переключателя темной темы.addEventListener, объекты событий, всплытие и делегирование. Практика: создание интерактивных табов и аккордеонов.createElement) и удалять (remove) узлы. Практика: разработка базового списка задач (To-Do List).localStorage, JSON.stringify и JSON.parse. Практика: сохранение пользовательских настроек и данных из форм после перезагрузки страницы.Теперь перейдем к первой теме нашего интенсива.
Что такое DOM и зачем он нужен
Когда браузер загружает HTML-код страницы, он не просто рисует текст на экране. Он читает этот код и строит на его основе внутреннюю структуру данных, которая называется DOM (Document Object Model — объектная модель документа).
> DOM — это представление HTML-документа в виде древовидной структуры объектов, с которой может взаимодействовать JavaScript. > > Студия веб-дизайна IZE
Представьте себе чертеж дома. Чертеж — это ваш HTML-файл. На бумаге нарисованы двери, окна и стены, но вы не можете открыть нарисованную дверь. Когда строители возводят реальный дом по этому чертежу, появляется физический объект. DOM — это и есть тот самый «построенный дом». JavaScript выступает в роли умного дома: он может программно открыть дверь, перекрасить стену или пристроить новый балкон, не меняя исходный бумажный чертеж.
Каждый HTML-тег становится узлом (node) в этом дереве. Тег <body> — это родительский узел для всех видимых элементов, а вложенные в него <p> или <div> — дочерние узлы.
Поиск элементов на странице
Чтобы изменить элемент, JavaScript должен сначала его найти. В современном стандарте языка для этого используются два универсальных метода, которые работают на основе привычных CSS-селекторов.
Метод querySelector
Метод document.querySelector() ищет на странице первый элемент, который соответствует указанному CSS-селектору, и возвращает его в виде объекта.
Если на странице есть десять кнопок с классом .submit-btn, этот метод вернет только самую первую из них. Если элемент не найден, метод вернет null.
Метод querySelectorAll
Если вам нужно найти все элементы с определенным селектором (например, все элементы списка задач), используется document.querySelectorAll().
Этот метод возвращает коллекцию элементов (NodeList). Хотя внешне она похожа на массив, это специальный объект браузера. Главное, что нужно о нем знать — его можно перебирать с помощью метода forEach.
| Метод | Что возвращает | Когда использовать | Пример из жизни |
| :--- | :--- | :--- | :--- |
| querySelector | Один объект (первый найденный) | Нужна конкретная кнопка, заголовок или уникальный блок | Найти кнопку «Отправить форму» |
| querySelectorAll | Коллекцию объектов (NodeList) | Нужно применить действие к группе однотипных элементов | Найти все карточки товаров на странице |
Существуют и старые методы поиска, такие как document.getElementById() или document.getElementsByClassName(). Они работают немного быстрее, но querySelector стал индустриальным стандартом благодаря своей гибкости — вы можете передать в него любой сложный CSS-селектор, например .card > ul li:first-child.
Изменение содержимого элементов
Найдя элемент, мы можем изменить текст внутри него или даже вставить новый HTML-код.
Свойство textContent
Свойство textContent позволяет получить или изменить текстовое содержимое элемента. Оно игнорирует любые HTML-теги и работает исключительно с текстом.
Если вы попытаетесь передать в textContent строку с HTML-тегами (например, <b>Привет</b>), браузер отобразит эти теги как обычный текст на экране. Это делает textContent абсолютно безопасным инструментом для вывода данных, которые ввел пользователь.
Свойство innerHTML
Свойство innerHTML работает иначе: оно позволяет читать и записывать полноценный HTML-код внутрь элемента. Браузер автоматически распарсит переданную строку и создаст новые узлы в DOM-дереве.
Важное правило безопасности: никогда не используйте innerHTML для вставки данных, полученных от пользователя (например, из полей ввода или комментариев). Если злоумышленник напишет в комментарии код <script>код вируса</script>, свойство innerHTML выполнит его. Это называется XSS-атакой (межсайтовый скриптинг). Для пользовательских данных всегда используйте textContent.
Управление стилями и классами
Динамическое изменение внешнего вида — основа интерактива. В JavaScript есть два пути: менять стили напрямую или управлять CSS-классами.
Прямое изменение стилей (inline-стили)
У каждого DOM-элемента есть свойство style, через которое можно обращаться к CSS-свойствам. Важное отличие: в CSS свойства пишутся через дефис (background-color), а в JavaScript используется camelCase (backgroundColor).
Этот подход добавляет стили прямо в атрибут style HTML-тега. Он имеет наивысший приоритет, но засоряет код. В современной разработке прямое изменение стилей используют редко — в основном для значений, которые вычисляются динамически (например, координаты курсора мыши).
Управление через classList
Лучшая практика — заранее описать все состояния элемента в CSS-файле (например, классы .active, .hidden, .dark-theme), а в JavaScript просто добавлять или удалять эти классы. Для этого используется объект classList.
У classList есть несколько невероятно полезных методов:
add('class-name') — добавляет класс.remove('class-name') — удаляет класс.contains('class-name') — проверяет, есть ли класс у элемента (возвращает true или false).toggle('class-name') — переключатель: если класса нет — добавляет его, если есть — удаляет.Метод toggle — настоящий швейцарский нож для Frontend-разработчика. С его помощью реализация темной темы занимает пару строк кода.
Представьте, что в вашем CSS есть такой код:
Тогда в JavaScript переключение темы будет выглядеть так:
При первом клике класс dark-theme добавится, и страница станет темной. При втором клике — удалится, и вернется светлая тема. Аналогичным образом создаются выпадающие меню, аккордеоны и модальные окна: вы просто переключаете класс .is-open или .hidden.
Умение находить элементы через querySelector и манипулировать их классами через classList — это фундамент, на котором строится 80% визуального интерактива на современных сайтах.