JavaRush /Курсы /Модуль 1: Web Core /Динамическое создание элементов:

Динамическое создание элементов: createElement, appendChild

Модуль 1: Web Core
23 уровень , 8 лекция
Открыта

1. Метод document.createElement: как создать новый элемент

В реальных веб-приложениях почти всегда возникает задача добавлять, удалять или менять элементы "на лету". Представьте:

  • Пользователь пишет новое сообщение — оно появляется в чате.
  • В интернет-магазине добавляется новый товар в корзину.
  • В списке задач появляется новая задача по нажатию кнопки.

Конечно, можно было бы заранее накидать в HTML тысячу пустых <div>, а потом их показывать и скрывать. Но это не только неэффективно, но и очень быстро превращает код в спагетти (а никто не любит спагетти в коде — только на обед!).

Вот почему у DOM есть специальные методы для создания и добавления элементов прямо из JavaScript.

Самый главный "фокусник" — это метод document.createElement. Он создаёт новый элемент указанного типа (например, <div>, <li>, <button>), который пока не виден на странице и не привязан к DOM-дереву.

Синтаксис

const newElement = document.createElement('тег');
  • 'тег' — это строка с названием HTML-тега, который вы хотите создать. Например, 'div', 'li', 'span', 'button'.

Пример: создаём кнопку

const btn = document.createElement('button');
btn.textContent = 'Нажми меня';

Пока эта кнопка существует только в памяти браузера. Она не появится на странице, пока мы её не "присоединим" к DOM.

2. Добавление элемента в DOM: appendChild и друзья

Чтобы новый элемент появился на странице, его нужно добавить в DOM-дерево. Для этого существует метод appendChild.

Синтаксис

родитель.appendChild(дочернийЭлемент);
  • родитель — элемент, к которому вы хотите добавить новый элемент (например, <ul>, <div>, <body>).
  • дочернийЭлемент — сам созданный элемент (например, наша кнопка).

Пример: добавляем кнопку в <body>

document.body.appendChild(btn);

Теперь кнопка реально появится на странице, и её можно будет увидеть (и даже нажать!).

3. Пример: добавляем задачу в список дел

Давайте свяжем это с нашим учебным приложением — предположим, у нас есть список дел (<ul id="todo-list"></ul>) и кнопка "Добавить задачу".

HTML-разметка

<ul id="todo-list"></ul>
<button id="add-btn">Добавить задачу</button>

JS-код для добавления новой задачи

const todoList = document.getElementById('todo-list');
const addBtn = document.getElementById('add-btn');

addBtn.addEventListener('click', function() {
    // 1. Создаём новый элемент <li>
    const newTask = document.createElement('li');
    // 2. Задаём текст задачи
    newTask.textContent = 'Новая задача';
    // 3. Добавляем <li> в <ul>
    todoList.appendChild(newTask);
});

Теперь каждый раз при нажатии на кнопку появляется новая задача!

4. Настройка созданного элемента: атрибуты, классы, стили

Конечно, просто создать элемент — это только начало. Обычно хочется сразу настроить его: добавить класс, задать стили, повесить обработчик событий.

Пример: создаём красивую задачу

const newTask = document.createElement('li');
newTask.textContent = 'Проверить почту';
newTask.classList.add('important-task');
newTask.style.color = 'red';

Можно даже добавить кнопку "Удалить":

const deleteBtn = document.createElement('button');
deleteBtn.textContent = 'Удалить';
deleteBtn.classList.add('delete-btn');

// Вложим кнопку внутрь <li>
newTask.appendChild(deleteBtn);

И вот у нас уже не просто задача, а интерактивный элемент!

5. Вложенность: создаём сложные структуры

С помощью createElement и appendChild можно строить сколько угодно сложные структуры. Например, задача с кнопкой удаления и чекбоксом:

const li = document.createElement('li');

const checkbox = document.createElement('input');
checkbox.type = 'checkbox';

const span = document.createElement('span');
span.textContent = 'Погладить кота';

const btn = document.createElement('button');
btn.textContent = 'Удалить';

li.appendChild(checkbox);
li.appendChild(span);
li.appendChild(btn);

todoList.appendChild(li);

Схема создаваемой структуры

<ul id="todo-list">
  <li>
    <input type="checkbox">
    <span>Погладить кота</span>
    <button>Удалить</button>
  </li>
</ul>

6. Практика: добавление задачи с пользовательским вводом

Давайте сделаем чуть сложнее: пусть пользователь сам вводит текст задачи.

HTML

<input id="task-input" type="text" placeholder="Введите задачу">
<button id="add-btn">Добавить задачу</button>
<ul id="todo-list"></ul>

JS

const input = document.getElementById('task-input');
const addBtn = document.getElementById('add-btn');
const list = document.getElementById('todo-list');

addBtn.addEventListener('click', function() {
    const text = input.value.trim();
    if (text === '') return; // Не добавляем пустые задачи

    const li = document.createElement('li');
    li.textContent = text;
    list.appendChild(li);

    input.value = ''; // Очищаем поле ввода
});

Теперь наш список дел действительно интерактивен!

7. Альтернативы appendChild: insertBefore, prepend и другие

appendChild добавляет элемент в конец списка дочерних элементов. Но иногда нужно добавить элемент в начало или в определённое место.

Добавить в начало: prepend

list.prepend(li); // Теперь задача появится первой в списке

Добавить перед определённым элементом: insertBefore

// Вставить li перед первым элементом списка
list.insertBefore(li, list.firstChild);

8. Удаление элементов: removeChild и element.remove()

Чтобы удалить элемент, можно воспользоваться removeChild или более современным методом element.remove().

Пример: удаляем задачу по клику на кнопку

li.appendChild(btn);

btn.addEventListener('click', function() {
    li.remove(); // Удаляет элемент из DOM
});

9. Типичные ошибки при динамическом создании элементов

Ошибка №1: забыли добавить элемент в DOM
Очень часто новички создают элемент через createElement, настраивают его, но забывают про appendChild — и удивляются, почему ничего не появляется на странице. Помните: пока вы не добавили элемент в DOM, он существует только в памяти браузера и невидим для пользователя.

Ошибка №2: обращение к несуществующим элементам
Если вы пытаетесь добавить дочерний элемент к родителю, которого нет на странице (например, опечатались в getElementById), получите ошибку или "ничего не происходит". Проверьте, что родитель существует.

Ошибка №3: повторное добавление одного и того же элемента
Если вы пытаетесь добавить один и тот же элемент в DOM несколько раз (например, один и тот же <li>), он просто "переедет" на новое место — в DOM один и тот же элемент может быть только у одного родителя. Если нужно добавить похожие элементы — создавайте для каждого новый объект через createElement.

Ошибка №4: забыли очистить поле ввода
После добавления задачи часто забывают очистить поле ввода. В результате пользователь думает, что ничего не произошло, хотя задача добавилась.

Ошибка №5: не удаляете обработчики событий
Если вы динамически создаёте элементы с обработчиками событий, убедитесь, что при удалении элементов не остаются "висящие" обработчики (это важно для сложных приложений, чтобы не было утечек памяти).

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ