Пошук уроків, статей та іншого контенту
textContent проти innerHTML, створення нових елементів, класи, стилі та атрибути.
Два способи змінити вміст елемента поводяться по-різному й мають різні наслідки для безпеки — розуміння різниці критичне, не лише стилістичне:
const el = document.querySelector("#message");
el.textContent = "<b>Привіт</b>"; // виведе текст ЯК Є, з тегами — безпечно
el.innerHTML = "<b>Привіт</b>"; // розпарсить як HTML, покаже жирний "Привіт"innerHTML з даними, які ввів користувач (наприклад, коментар чи повідомлення в чаті), — класична вразливість XSS (Cross-Site Scripting): якщо вміст містить <script> чи обробники подій, вони виконаються. Для будь-яких даних, що не повністю контролюються вами, використовуйте textContent — і жодного ризику виконання коду.
const li = document.createElement("li");
li.textContent = "Нове завдання";
li.classList.add("task");
document.querySelector("#task-list").appendChild(li);
// або сучасніший append(), що приймає й текст, і кілька елементів одразу:
document.querySelector("#task-list").append(li);const item = document.querySelector("#task-1");
item.remove(); // сучасний спосіб — видаляє сам себе
// старіший спосіб, досі трапляється в коді:
item.parentElement.removeChild(item);classList — найзручніший спосіб керувати CSS-класами елемента без ручного розбору рядка:
const card = document.querySelector(".card");
card.classList.add("active"); // додати клас
card.classList.remove("hidden"); // прибрати клас
card.classList.toggle("expanded"); // додати, якщо немає; прибрати, якщо є
card.classList.contains("active"); // true/false — перевірка наявностіПеремикання видимості чи стану найкраще робити саме через classList, а стилі тримати в CSS-файлі (наприклад, .hidden { display: none; }) — це розділяє логіку (JS) і зовнішній вигляд (CSS), замість жорсткого прописування стилів прямо в скрипті.
Іноді значення обчислюється динамічно, і заздалегідь прописати клас у CSS неможливо:
const progressBar = document.querySelector(".progress");
progressBar.style.width = `${percent}%`; // динамічне значення, обчислене в кодіconst img = document.querySelector("img");
img.getAttribute("src"); // отримати значення атрибута
img.setAttribute("alt", "Опис фото"); // встановити атрибут
// data-* атрибути мають зручний спеціальний доступ:
// <li data-task-id="42">...
taskEl.dataset.taskId; // "42" — camelCase-версія data-task-idfunction addTask(text) {
const li = document.createElement("li");
li.textContent = text; // textContent — безпечно, навіть якщо text увів користувач
li.classList.add("task");
document.querySelector("#task-list").append(li);
}Використання innerHTML з неперевіреним користувацьким вводом — ризик XSS.
Пряме встановлення стилів через .style, коли досить додати/прибрати CSS-клас — ускладнює підтримку.
Забування, що createElement лише створює елемент у пам'яті — він не з'явиться на сторінці, поки його не додати через append/appendChild.
textContent змінює лише текст безпечно, innerHTML парсить рядок як HTML і небезпечний для неперевірених даних. createElement + append створюють і додають нові елементи, remove() видаляє. classList — основний інструмент для зміни зовнішнього вигляду через CSS-класи замість прямих стилів.
Спробуйте самостійно
Напишіть функцію createBadge(text, isSuccess), яка створює <span> з текстом text і класом "badge-success" або "badge-error" залежно від isSuccess, і повертає готовий елемент (без додавання на сторінку).