
Манипуляция DOM с помощью JavaScript позволяет динамически формировать структуру страницы без ручного изменения HTML-кода. На практике это означает возможность создавать теги, присваивать им атрибуты и внедрять их в нужное место документа уже после загрузки страницы.
Основой для добавления нового узла служит метод document.createElement(), который генерирует элемент по имени тега. После создания его можно наполнить содержимым через textContent или innerHTML, а также назначить классы, идентификаторы и другие атрибуты.
Чтобы встроить элемент в существующую структуру, используются методы appendChild(), prepend() или insertBefore(). Выбор зависит от того, нужно ли разместить узел в конце списка дочерних элементов, в начале или перед конкретным соседним элементом. Такой подход дает полный контроль над порядком элементов на странице.
Практически полезно комбинировать создание узлов с событиями. Например, при клике на кнопку формируется новый абзац или список, что делает интерфейс интерактивным. Это снижает количество избыточного HTML в исходном коде и повышает скорость отклика страницы.
Создание нового элемента через document.createElement()

Метод document.createElement(tagName) формирует DOM-узел указанного типа, который изначально не привязан к дереву документа. После создания его можно настраивать: добавлять атрибуты, классы, текстовые узлы и затем вставлять в нужное место.
Пример:
const div = document.createElement("div");
div.className = "note";
div.textContent = "Текст внутри блока";
document.body.appendChild(div);
Созданный элемент появляется на странице только после явного добавления в DOM. Без appendChild, prepend или аналогичных методов он остаётся в памяти.
Сравнение действий:
| Шаг | Метод/Свойство | Назначение |
|---|---|---|
| 1 | createElement("tag") |
Создание пустого узла указанного тега |
| 2 | element.className = ... |
Добавление CSS-класса |
| 3 | element.textContent = ... |
Вставка текста без HTML |
| 4 | appendChild или prepend |
Встраивание элемента в документ |
Для вставки HTML внутри нового узла используется innerHTML, но предпочтительнее textContent, чтобы исключить интерпретацию кода и повысить безопасность.
Добавление текста в элемент с помощью textContent и innerHTML

Свойство textContent вставляет текст без интерпретации HTML. Пример:
const div = document.querySelector('#block');
div.textContent = '<strong>Текст</strong>';
В результате в элементе появится строка «<strong>Текст</strong>», а не выделенный жирным текст.
Свойство innerHTML обрабатывает HTML-разметку. Тот же пример:
const div = document.querySelector('#block');
div.innerHTML = '<strong>Текст</strong>';
Теперь внутри элемента будет создан тег <strong>, и текст станет жирным.
Вставка элемента в конец блока методом appendChild()
Метод appendChild() добавляет новый узел в конец списка дочерних элементов выбранного контейнера. Работает только с объектами DOM, строку HTML вставить им нельзя.
Порядок действий:
- Создать элемент с помощью
document.createElement(). - При необходимости добавить текст через
textContentили вложить другой узел. - Получить ссылку на родительский блок.
- Вызвать
appendChild()для родителя, передав созданный элемент.
Пример:
const list = document.getElementById("items");
const newItem = document.createElement("li");
newItem.textContent = "Новый пункт";
list.appendChild(newItem);
Особенности использования:
- Если переданный узел уже существует в документе, он будет перемещён, а не скопирован.
- Метод возвращает сам добавленный узел, что удобно для последующих операций.
- Работает быстрее, чем вставка HTML-строки, так как исключает этап парсинга разметки.
Рекомендуется использовать appendChild(), когда требуется строгий контроль над созданием иерархии элементов и предотвращение внедрения нежелательного кода.
Добавление элемента перед существующим узлом с insertBefore()

Метод insertBefore() позволяет вставить новый элемент не в конец списка, а точно перед выбранным узлом. Это удобно, если важен порядок отображения.
Сигнатура: parentNode.insertBefore(newNode, referenceNode). Первый аргумент – узел, который нужно добавить, второй – существующий узел, перед которым произойдёт вставка.
Пример: пусть в списке <ul> уже есть элементы, и требуется вставить новый пункт перед первым:
const ul = document.querySelector("ul");
const li = document.createElement("li");
li.textContent = "Новый пункт";
ul.insertBefore(li, ul.firstChild);
Если в качестве referenceNode указать null, элемент окажется в конце контейнера, что делает метод универсальным.
При использовании важно убедиться, что referenceNode действительно принадлежит parentNode, иначе произойдёт ошибка NotFoundError.
Использование append() и prepend() для гибкого размещения
Метод append() добавляет новые узлы или строки в конец содержимого выбранного элемента. Это удобно, когда требуется расширять список или формировать блоки в последовательном порядке.
Метод prepend() вставляет элементы в начало, что позволяет выделить приоритетные данные или разместить уведомления перед основным содержимым.
Оба метода принимают неограниченное количество аргументов: можно передавать как строки, так и созданные через document.createElement() узлы. В отличие от innerHTML, при их использовании не происходит перезаписи структуры, что снижает риск потери обработчиков событий.
Назначение атрибутов и классов новому элементу
Для установки атрибутов используется метод setAttribute(name, value). Примеры:
element.setAttribute('id', 'main-button')– уникальный идентификатор для обращения черезgetElementById.element.setAttribute('data-role', 'admin')– пользовательские атрибутыdata-*для хранения вспомогательных данных.element.setAttribute('title', 'Нажмите для действия')– всплывающая подсказка при наведении.
Для добавления классов применяется свойство classList, которое поддерживает удобные методы:
element.classList.add('btn', 'btn-primary')– добавление одного или нескольких классов одновременно.element.classList.remove('hidden')– удаление класса при необходимости.element.classList.toggle('active')– переключение состояния класса для динамических эффектов.element.classList.contains('btn')– проверка наличия класса перед выполнением логики.
Рекомендации по практике:
- Использовать семантические классы, отражающие роль элемента, а не только визуальные стили.
- Присваивать уникальные идентификаторы только тем элементам, к которым потребуется прямой доступ через JavaScript.
- Сохранять пользовательские данные в
data-*атрибутах, чтобы избежать конфликта с стандартными атрибутами. - Избегать прямого присвоения
classNameпри необходимости добавить несколько классов динамически, чтобы не перезаписать существующие.
Правильное назначение атрибутов и классов обеспечивает гибкость и упрощает управление новыми элементами в DOM, позволяя легко комбинировать стили, события и данные.
Создание вложенных структур элементов динамически

Для динамического создания сложных вложенных структур необходимо использовать document.createElement и методы управления DOM. Сначала создается корневой элемент, затем к нему последовательно добавляются дочерние элементы через appendChild или append.
Пример: создание списка с подсписками:
Шаг 1: создаем основной контейнер ul и добавляем его в существующий элемент страницы:
const mainList = document.createElement('ul');
document.body.appendChild(mainList);
Шаг 2: создаем пункты списка и вложенные списки:
const item1 = document.createElement('li');
item1.textContent = 'Раздел 1';
const sublist = document.createElement('ul');
const subitem = document.createElement('li');
subitem.textContent = 'Подраздел 1.1';
sublist.appendChild(subitem);
item1.appendChild(sublist);
mainList.appendChild(item1);
Для структур с большим количеством уровней рекомендуется использовать функции рекурсии. Функция принимает массив объектов, где каждый объект содержит название элемента и массив дочерних элементов, и возвращает полностью сформированную DOM-структуру.
Пример рекурсивной функции:
function createList(data) {
const ul = document.createElement('ul');
data.forEach(item => {
const li = document.createElement('li');
li.textContent = item.name;
if(item.children) {
li.appendChild(createList(item.children));
}
ul.appendChild(li);
});
return ul;
}
Эта техника позволяет формировать многоуровневые меню, каталоги и структуры контента без повторного кода, обеспечивая легкое управление вложенностью и динамическое обновление элементов.
Для повышения производительности при добавлении множества элементов используйте DocumentFragment. Он позволяет собрать все элементы вне DOM, а затем добавить их одним действием, минимизируя перерисовку страницы.
Пример использования DocumentFragment:
const fragment = document.createDocumentFragment();
data.forEach(item => {
const li = document.createElement('li');
li.textContent = item;
fragment.appendChild(li);
});
mainList.appendChild(fragment);
Следуя этим подходам, можно создавать гибкие и поддерживаемые вложенные структуры, управлять их содержимым и легко модифицировать при изменении данных.
Удаление и замена элементов после вставки

Для удаления элемента из DOM после его добавления используется метод remove(). Например, document.getElementById(‘target’).remove() полностью удаляет элемент с идентификатором target и его потомков. Альтернатива – метод removeChild(), который применяется через родительский элемент: parentNode.removeChild(childNode). Он полезен, когда требуется контроль над порядком удаления элементов.
Замена элемента возможна с помощью метода replaceChild(newNode, oldNode). Этот метод сохраняет структуру DOM, удаляя oldNode и вставляя newNode на его место. Важно убедиться, что newNode создан и готов к вставке, иначе элемент не отобразится корректно.
При динамическом обновлении содержимого рекомендуется использовать cloneNode(true) для копирования узлов с потомками перед заменой. Это предотвращает потерю вложенных элементов и событий. Для одновременной замены нескольких элементов эффективнее применять DocumentFragment, собирая новые элементы в фрагмент, а затем заменяя старый блок одним действием.
Удаление и замена элементов напрямую влияют на производительность страницы. Для элементов с большим количеством потомков предпочтительно сначала удалить их с DOM, затем модифицировать вне документа и только после этого вставлять обратно. Это снижает количество перерисовок и повышает отзывчивость интерфейса.
Вопрос-ответ:
Можно ли добавлять несколько элементов одновременно, чтобы не перегружать DOM?
Да, вместо того чтобы вставлять каждый элемент по отдельности, используют DocumentFragment. Это объект, который временно хранит элементы в памяти. Сначала создают фрагмент, добавляют в него все нужные элементы, а затем вставляют фрагмент в DOM одним действием. Такой подход сокращает количество операций с DOM и делает добавление более быстрым и аккуратным.
Как добавить новый элемент в HTML с помощью JavaScript?
Для добавления элемента сначала создается объект с помощью метода document.createElement(), где в качестве аргумента указывается нужный тег. Затем можно установить его содержимое или атрибуты, используя свойства textContent, innerHTML или setAttribute(). После этого элемент помещается в документ через метод appendChild() или insertBefore(), указывая родительский узел, куда его нужно добавить.
Можно ли добавить элемент в конкретное место страницы, а не в конец контейнера?
Да, для вставки в определённое место используют метод insertBefore(), который принимает два аргумента: новый элемент и существующий элемент-контейнер, перед которым нужно вставить новый узел. Если требуется вставить после определённого элемента, можно использовать комбинацию parentNode.insertBefore(newNode, referenceNode.nextSibling). Такой подход позволяет точно управлять расположением элементов на странице без удаления других узлов.
