1. Работа с DOM и создание интерактивных веб-страниц
Архитектура браузера и Document Object Model
Когда браузер получает HTML-документ от сервера, он не просто выводит текст на экран. Программа анализирует код и выстраивает сложную внутреннюю структуру, которая называется Document Object Model (DOM). Это интерфейс прикладного программирования (API), который связывает веб-страницу со скриптовыми языками.
DOM представляет страницу в виде иерархического дерева. Корнем этого дерева является объект document. Абсолютно всё, что находится внутри HTML-файла, превращается в node (узел). Понимание того, как устроены эти узлы, является фундаментом для создания сложных интерактивных интерфейсов.
В спецификации выделяют несколько основных типов узлов:
* Элементные узлы (Element nodes) — сами HTML-теги, формирующие каркас страницы (например, <body>, <div>, <a>).
* Текстовые узлы (Text nodes) — текст, находящийся внутри тегов. Важно понимать, что даже переносы строк и пробелы в HTML-коде браузер может интерпретировать как отдельные текстовые узлы.
* Узлы-комментарии (Comment nodes) — комментарии разработчиков, которые не видны пользователю, но присутствуют в структуре дерева.
> Document Object Model — это кроссплатформенный и независимый от языка способ управления документами HTML и XML, предоставляющий функции, позволяющие эффективно добавлять, удалять и изменять части документа. > > js-ts-node.github.io
Декларативный поиск и выборка элементов
Для того чтобы JavaScript мог «оживить» страницу, ему необходимо найти нужные элементы в DOM-дереве. Современный стандарт предоставляет разработчикам несколько методов для поиска, которые отличаются по производительности и типу возвращаемых данных.
| Метод | Возвращаемый результат | Скорость работы | Особенности поведения |
| --- | --- | --- | --- |
| getElementById | Один элемент (Element) | Очень высокая | Ищет строго по уникальному идентификатору. Если на странице несколько элементов с одинаковым ID, вернет только первый. |
| getElementsByClassName | Живая коллекция (HTMLCollection) | Высокая | Коллекция автоматически обновляется, если в DOM добавляются или удаляются элементы с указанным классом. |
| querySelector | Один элемент (Element) | Средняя | Использует синтаксис CSS-селекторов. Возвращает первое найденное совпадение. |
| querySelectorAll | Статичная коллекция (NodeList) | Средняя | Возвращает все совпадения. Коллекция не реагирует на последующие изменения в DOM-дереве. |
В современной разработке querySelector и querySelectorAll стали индустриальным стандартом благодаря своей гибкости. Они позволяют находить элементы по сложным CSS-селекторам, что избавляет от необходимости писать громоздкий код для обхода дерева вручную.
Манипуляции с узлами и проблема производительности
Изменение DOM — одна из самых ресурсоемких операций в JavaScript. Когда скрипт добавляет, удаляет или изменяет геометрию элемента, браузер вынужден пересчитывать позиции и размеры других элементов. Этот процесс называется Reflow (перекомпоновка), за которым неизбежно следует Repaint (перерисовка пикселей на экране).
Если время выполнения скрипта миллисекунд, браузер может пропустить кадр анимации, так как при стандарте в 60 FPS на отрисовку одного кадра отводится миллисекунд. Частые манипуляции с DOM приводят к «зависанию» интерфейса и негативному пользовательскому опыту.
Представим, что нам нужно добавить 1000 новых строк в таблицу. Если мы будем добавлять каждую строку напрямую в DOM внутри цикла, браузер запустит процесс Reflow 1000 раз. При времени одной перекомпоновки в 2 миллисекунды, 1000 вставок займут 2000 миллисекунд (2 секунды полной блокировки страницы).
Для оптимизации таких задач используется DocumentFragment — легковесный, невидимый контейнер, который существует только в оперативной памяти и не является частью активного DOM-дерева.
Безопасность при работе с содержимым
При обновлении текстового содержимого узлов разработчики часто выбирают между свойствами innerHTML и textContent. Свойство innerHTML парсит переданную строку как HTML-код. Это мощный инструмент, но он открывает уязвимость для атак типа Cross-Site Scripting (XSS), если данные поступают из ненадежного источника (например, из формы комментариев).
Свойство textContent обрабатывает любые переданные данные исключительно как обычный текст. Если злоумышленник попытается отправить строку <script>alert('Взлом')</script>, свойство textContent безопасно выведет этот текст на экран, не позволив браузеру выполнить вредоносный код.
По статистике специалистов по кибербезопасности, XSS-уязвимости составляют значительную долю всех брешей в веб-приложениях. Использование textContent для любых пользовательских данных — это базовое правило безопасной фронтенд-архитектуры, которое необходимо внедрять на самых ранних этапах разработки.