Get In Touch
admin@victoriaweb.me
Back

JavaScript DOM

Це досить об’ємна тема, проте робить простішим її вивчення те, що тут ми багато працюєм і бачим результат на фронтенді. Тобто ми можем додавати і видаляти елементи на сторінці, міняти css стилі за домомогою DOM маніпуляції, змінювати різноманітні властивості елементів залежно від зміни розмірів екрану і ще багато всього. Почнемо з простих основ і прикладів і в кінцв статті буде великий список у форматі: питання – відповідь щоб легше було повторяти цю тему потім і освіжати знання.

Вміст Сховати

Що таке DOM?

DOM (Document Object Model) – це об’єктна модель документа, яка представляє HTML-сторінку у вигляді дерева вузлів. DOM є частиною стандарту, який дозволяє програмно змінювати структуру, стиль і вміст веб-сторінки за допомогою JavaScript. У цій ієрархії є кореневий вузол document, який містить html, а той у свою чергу – head і body, всередині яких знаходяться інші елементи. DOM включає різні типи вузлів: елементи, текст, атрибути та коментарі. За допомогою DOM API можна динамічно змінювати веб-сторінку: додавати і видаляти елементи, змінювати стилі та взаємодіяти з подіями через Event API.

Графічне представлення дерева HTML DOM

DOM включає різні типи вузлів:

  • Element nodes – це самі HTML-елементи (<div>, <p>, <a> і т.д.).
  • Text nodes – це текстові вузли, які знаходяться всередині елементів.
  • Attribute nodes – це вузли, які представляють атрибути HTML-елементів.
  • Comment nodes – це вузли, які містять коментарі в коді (<!-- коментар -->).

DOM дозволяє динамічно змінювати структуру та стиль веб-сторінки.

Що ми можемо робити з DOM

add

Додавати та видаляти HTML-елементи, заміняти одні елементи іншими.

pen

Змінювати вміст та атрибути елементів. Додавати слухачі подіій щоб реагувати як нам потрібно на будь які зміни на сторінці.

paint

Маніпулювати CSS-стилями, додаючи стилі напряму як інлайн стилі або змінювати клас елемента, що впливає на його стидізацію.

Як вибирати елементи в DOM

Щоб щось зробити з елементами DOM, вам спочатку потрібно вибрати або отримати доступ до відповідного елемента. У цьому розділі ви дізнаєтесь про деякі поширені методи вибору елементів DOM.

document.getElementById(id)

Повертає лише один елемент, оскільки id має бути унікальним у межах сторінки. Якщо елемент з таким id не знайдено, повертає null.

let element = document.getElementById('myId');

document.getElementsByClassName(className)

Вибирає всі елементи, які мають вказаний клас. Повертає HTMLCollection (живу колекцію), яка автоматично оновлюється при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію.

let elements = document.getElementsByClassName('myClass');

document.getElementsByTagName(tagName)

Вибирає всі елементи з вказаним тегом (наприклад, div, p, a).Повертає HTMLCollection (живу колекцію), яка автоматично оновлюється при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію.

let element = document.getElementById('myId');

document.querySelector(selector)

Вибирає перший елемент, який відповідає вказаному CSS-селектору. Повертає лише один елемент. Якщо елемент не знайдено, повертає null. Може використовувати будь-який CSS-селектор.

let element = document.querySelector('.myClass');

document.querySelectorAll(selector)

Вибирає всі елементи, які відповідають вказаному CSS-селектору. Повертає NodeList (статичну колекцію), яка не оновлюється автоматично при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію. Може використовувати будь-який CSS-селектор.

let elements = document.querySelectorAll('.myClass');

document.getElementsByName(name)

Вибирає всі елементи з вказаним значенням атрибута name. Повертає NodeList (статичну колекцію), яка не оновлюється автоматично при зміні DOM.

let elements = document.getElementsByName('myName');

Як змінити вміст елементів DOM

innerHTML

innerHTML дозволяє змінювати або отримувати HTML-вміст елемента.

let content = document.getElementById("myElement").innerHTML;
console.log(content); // Виведе поточний HTML-код всередині елемента

📌 Коли варто використовувати?

  • ✅Якщо потрібно додати HTML-код.
  • ✅Якщо треба вставити багато тегів.

⚠️ Мінуси:

  • ⛔️Може спричинити проблеми з безпекою (XSS-атаки, якщо вставляти користувацький ввід).
  • ⛔️Повністю перезаписує вміст (може видалити вкладені обробники подій).

innerText

innerText дозволяє змінювати або отримувати текстовий вміст елемента, без тегів.

document.getElementById("myElement").innerText = "Привіт, світ!";

📌 Яка Відмінність від innerHTML?

innerText не інтерпретує HTML-теги, а просто вставляє текст.

textContent

innerHTML дозволяє змінювати або отримувати HTML-вміст елемента.

<div id="myElement" style="display: none;">Прихований текст</div>

console.log(document.getElementById("myElement").textContent); // "Прихований текст"

📌 Коли варто використовувати textContent замість innerText?

textContent повертає ВЕСЬ текст елемента, навіть прихований за CSS (display: none). innerText не повертає прихований текст.

value

Якщо потрібно змінити текст в полях введення (<input> або <textarea>), то використовуйте value:

<input type="text" id="myInput" value="Старий текст">
document.getElementById("myInput").value = "Новий текст";

📌 Коли варто використовувати?

Для зміни вмісту полів введення (<input>, <textarea>).

createTextNode

Якщо треба додати текст без ризику вставки HTML, можна використовувати createTextNode().

let newText = document.createTextNode("Привіт, світ!");
document.getElementById("myElement").appendChild(newText);

📌 Перевага: не дозволяє вставку HTML, тому безпечніше.

insertAdjacentHTML

Якщо потрібно вставити HTML без перезапису всього вмісту елемента:

document.getElementById("myElement").insertAdjacentHTML("beforeend", "<b>Додатковий текст</b>");

📌 Режими вставки:

  • "beforebegin" – перед елементом.
  • "afterbegin" – всередині, перед наявним вмістом.
  • "beforeend" – всередині, після наявного вмісту.
  • "afterend" – після елемента.

Отже, використовуєм:

  • innerHTML – якщо треба вставити HTML.
  • innerText або textContent – якщо тільки текст.
  • value – якщо змінюєш текст в <input> або <textarea>.
  • createTextNode() – якщо треба безпечна вставка тексту.
  • insertAdjacentHTML() – якщо треба вставити HTML у конкретне місце.

Робота зі стилями елементів в DOM

Всього є 5 основних способів зміни стилів через DOM:

1. Властивість style (inline-стилі)

Цей метод дозволяє змінювати стилі елемента безпосередньо через JavaScript.

Синтаксис:

element.style.property = "значення";

❗️Стилі змінюються лише для конкретного елемента, а не для всіх подібних.

🔅 Важливі моменти:

  • ✅Використовуємо camelCase (без - між словами). Наприклад, background-colorbackgroundColor.
  • ✅Працює тільки для inline-стилів (ті, що безпосередньо додаються до елемента).
const box = document.getElementById("box"); // Отримуємо елемент
box.style.backgroundColor = "red"; // Змінюємо колір фону
box.style.width = "200px"; // Встановлюємо ширину
box.style.height = "100px"; // Встановлюємо висоту

2. CSS-класи classList

Зручніший метод для додавання, видалення або перемикання CSS-класів. Методи classList:

  • element.classList.add(“class-name”) – додає клас.
  • element.classList.remove(“class-name”) – видаляє клас.
  • element.classList.toggle(“class-name”) – додає клас, якщо його немає, або видаляє, якщо є.
  • element.classList.contains(“class-name”) – перевіряє, чи є клас.
  • element.classList.replace(“old-class”, “new-class”);

✅Можна легко застосовувати стилі з CSS, а не вручну прописувати кожне значення.

const box = document.getElementById("box");
box.classList.add("active"); // Додає клас "active"
box.classList.remove("hidden"); // Видаляє клас "hidden"
box.classList.toggle("selected"); // Якщо "selected" є - видаляє, якщо немає - додає
element.classList.replace("old-class", "new-class");// Якщо "old-class" є, він змінюється на "new-class".

3. getComputedStyle – отримання поточних стилів

Якщо треба дізнатися, який стиль зараз застосований до елемента.

✅Показує реальний стиль, навіть якщо він заданий через CSS, а не style

const box = document.getElementById("box");
const styles = getComputedStyle(box);
console.log(styles.backgroundColor); // Виведе, наприклад, "rgb(255, 0, 0)"
//Синтаксис:
getComputedStyle(element)
getComputedStyle(element, pseudoElt)

4. Додавання стилів через setAttribute

Недолік: Перезаписує всі попередні inline-стилі.

const box = document.getElementById("box");
box.setAttribute("style", "background-color: blue; width: 150px;");

5. Створення та додавання стилів через Style

Якщо потрібно додати стилі через JavaScript в <style>.

✅Показує реальний стиль, навіть якщо він заданий через CSS, а не style

const style = document.createElement("style");
style.textContent = `
  .dynamic-style {
    color: white;
    background-color: black;
    padding: 10px;
  }
`;
document.head.appendChild(style); // Додаємо стиль у <head>

const box = document.getElementById("box");
box.classList.add("dynamic-style"); // Додаємо клас до елемента
element - це елемент, для якого потрібно отримати обчислений стиль.
pseudoElt - не обовязковий параметр, цеядок, що вказує псевдоелемент для збігу.

Що обрати?

МетодПеревагиНедоліки
.styleПростий у використанніПерезаписує inline-стилі, погано для масштабування
.classListВикористовує CSS-класи, легко змінюватиНе можна отримати конкретний стиль
getComputedStyle(element) або getComputedStyle(element, pseudoElt)Дозволяє дізнатися реальні стилі елементаТільки для читання
setAttribute(“element”, “…”) Можна встановити багато стилів одночасноПерезаписує всі inline-стилі
Додавання в <style>Дозволяє глобальні зміниТрохи складніше, ніж .classList

🔹 Рекомендація: Якщо стилі часто змінюються, краще працювати через classList. Якщо треба змінити щось разово – можна через style.

Робота з атрибутами елементів в DOM

Робота з атрибутами елементів у DOM в JavaScript дозволяє змінювати поведінку та вигляд HTML-елементів, додавати їм додаткові властивості або отримувати значення вже встановлених атрибутів.

Що таке атрибути елементів?

Атрибути — це додаткові властивості елементів HTML, які визначають їх поведінку або зовнішній вигляд.

У JavaScript ми можемо:

Отримувати значення атрибутів, змінювати їх, додавати нові, видаляти. Наприклади атрибутів:

  • id — унікальний ідентифікатор елемента
  • class — клас для застосування стилів
  • src — шлях до зображення для тегу <img>
  • href — посилання для тегу <a>
  • alt — альтернативний текст для зображення (якщо зображення не завантажиться)
  • type — визначає тип елемента форми (наприклад, текст, пароль, кнопка)
  • value — значення елемента форми (наприклад, текст у полі вводу)
  • placeholder — текст-підказка для поля вводу
  • disabled — робить елемент форми неактивним
  • controls — додає елементам відео чи аудіо кнопки управління (відтворення, пауза тощо)
  • autoplay — автоматичне відтворення відео чи аудіо
  • loop — повторне відтворення мультимедіа
  • colspan — об’єднує кілька стовпців у таблиці
  • rowspan — об’єднує кілька рядків у таблиці
  • data-* — користувацькі атрибути, які можна використовувати для зберігання додаткової інформації
  • aria-* — атрибути для покращення доступності веб-сторінок
  • title — текст, який з’являється при наведенні на елемент
  • style — додає вбудовані стилі до елемента

Основні методи для роботи з атрибутами

МетодОпис
getAttribute(name)отримати значення атрибута
setAttribute(name, value)додати або змінити атрибут
hasAttribute(name)перевірити, чи є атрибут
removeAttribute(name)видалити атрибут
//Приклад HTML:  <img id="myImg" src="cat.jpg" alt="Коте-муркоте, коте - красоте">

const srcValue = img.getAttribute('src');
console.log(srcValue); // ➡️ "cat.jpg"

img.setAttribute('src', 'dog.jpg');
//setAttribute має 2 аргументи:
//перший — назва атрибута, "src"
//другий — нове значення, "dog.jpg"
//Якщо src вже був — він зміниться.
//Якщо src не було — він додасться.

if (img.hasAttribute('alt')) {
  console.log('Є опис картинки!');
}//hasAttribute('alt') повертає true, якщо атрибут є, і false — якщо немає.


img.removeAttribute('alt');//Видаляє атрибут alt. Після цього опис картинки зникне.

//Ще приклад: робота з data-* атрибутами


//<button id="buyBtn" data-product-id="12345">Купити</button>

const btn = document.getElementById('buyBtn');
const productId = btn.getAttribute('data-product-id');
console.log(productId); // ➡️ "12345"

//Атрибути, які починаються з data-, ми часто використовуємо для зберігання додаткових даних.

//Альтернатива: dataset
console.log(btn.dataset.productId); // ➡️ "12345"

// Тут:

//dataset — спеціальний об'єкт у JS
//productId — назва частини після data-, але без дефісів

Як переміщатись серед елементів в DOM

У DOM є цілий набір властивостей, які дозволяють нам переходити:

  • від батьківського елемента до дочірнього
  • від дочірнього до батьківського
  • між сусідніми елементами (братами/сестрами)
  • або отримати список усіх дітей

Основні властивості для навігації в DOM:

ВластивістьПояснення
parentNodeПовертає батьківський вузол
childNodesПовертає всі дочірні вузли (включно з текстовими, пробілами)
childrenПовертає тільки дочірні елементи (без тексту і коментарів)
firstChildПовертає першу дитину (може бути текстовим вузлом)
firstElementChildПовертає перший дочірній елемент батьківського
lastChildПовертає останню дитину – нод, батьківського елемента
lastElementChildПовертає останній дочірній елемент
nextSiblingПовертає наступного сусіднього вузла в межах того ж батьківського елемента
nextElementSiblingПовертає наступний елемент (тег) та ігнорує ноди які е є елементами
previousSiblingПовертає попереднього сусіда (може бути текстом) який знаходиться в межах тго ж батьківського елемента
previousElementSiblingПовертає попередній елемент та ігнорує ноди які не є елементами (текст, коментар, перенос рядка – це все ноди які не є елементами)

Навігація JavaScript на прикладах:

const container = document.getElementById("container");

// 1. Діти (всі вузли, включаючи пробіли)
console.log(container.childNodes); // NodeList(5): текст, <p>, текст, <p>, текст

// 2. Тільки елементи
console.log(container.children); // HTMLCollection(2): <p>, <p>

// 3. Перший і останній елемент
console.log(container.firstElementChild); // <p>Перший абзац</p>
console.log(container.lastElementChild);  // <p>Другий абзац</p>

// 4. Батьківський елемент
console.log(container.parentNode); // <body> або інший батько

// 5. Сусіди
const firstP = container.firstElementChild;
console.log(firstP.nextElementSibling); // <p>Другий абзац</p>
console.log(firstP.previousElementSibling); // null (бо це перший)

const secondP = firstP.nextElementSibling;
console.log(secondP.previousElementSibling); // <p>Перший абзац</p>

💡 Дуже важливо пам’ятати:

  • childNodes включає всі вузли, навіть пробіли і перенос рядка, бо вони — це теж текстові вузли.
  • Якщо хочете працювати тільки з тегами (елементами) — використовуйте children, firstElementChild, nextElementSibling і подібні.

Різниця між вузлом та елементом

Розібратися в різниці між вузлом (node) і елементом (element) — це ключ до глибшого розуміння DOM.

Що таке Node (вузол)?

У DOM все, що є частиною HTML-документа, є вузлом (node):

  • HTML-теги — це елементи (element nodes)
  • Текст між тегами — це текстові вузли (text nodes)
  • Коментарі — це comment nodes
  • Навіть сам <document> — це теж вузол

Тобто:

“Усі елементи — це вузли, але не всі вузли — це елементи.”

Наочний приклад:

<div id="myDiv">
  <p>Привіт</p>
  <span>Світ</span>
</div>

div (element node)
├── текстовий вузол ("\n  ")
├── p (element node)
│   └── текстовий вузол ("Привіт")
├── текстовий вузол ("\n  ")
├── span (element node)
│   └── текстовий вузол ("Світ")
└── текстовий вузол ("\n")

🧪 КОД: Порівняння childNodes vs children

const div = document.querySelector('#myDiv');

console.log('childNodes:', div.childNodes);
console.log('children:', div.children);

🔸 div.childNodes — це всі вузли, включно з пробілами, переносами рядків, текстом і тегами

NodeList(5) [
  #text,              // перенос рядка або пробіл перед <p>
  <p>,                // тег <p>
  #text,              // перенос після </p>
  <span>,             // тег <span>
  #text               // перенос після </span>
]

🔸 div.children — це тільки елементи, тобто теги (HTML елементи):

HTMLCollection(2) [
  <p>Привіт</p>,
  <span>Світ</span>
]

✅ Перенос рядка (\n), пробіли і текст типу "Привіт" — це всі text node (текстові вузли).

Незалежно від того:

  • чи це просто “видимий текст” для користувача (Привіт)
  • чи це “невидимий пробіл або перенос рядка” (наприклад, між тегами в HTML)

👉 В обох випадках — це Text Node, тобто вузол з типом nodeType === 3.

🧠 Вам в допомогу — шпаргалка:

ТипВузол?Елемент?
<div>
<p>
"Привіт" (текст)
Коментар <!-- Hello -->
\n (перенос рядка або пробіл у HTML)

✨ Як перевірити тип вузла?

const p = document.querySelector('p');
console.log(p.nodeType); // 1 — це ELEMENT_NODE

const textNode = p.firstChild;
console.log(textNode.nodeType); // 3 — це TEXT_NODE

Типи вузлів:

nodeType (.nodeType)Значення (.nodeValue)
1Елемент (element)
3Текст (text)
8Коментар (comment)

💡 Порада:

🔸 Якщо хочете тільки HTML-теги — використовуйте:

  • children
  • firstElementChild
  • nextElementSibling

🔸 Якщо потрібно бачити все (включно з пробілами/текстом) — використовуйте:

  • childNodes
  • firstChild
  • nextSibling

Події та слухачі подій в DOM

Події та слухачі подій (Event Listeners) є важливими аспектами роботи з Document Object Model (DOM) у JavaScript.

DOM-події – це дії, які відбуваються в браузері. Саме ці події дозволяють робити веб-сайти інтерактивними.

Деякі DOM-події ініціюються користувачем, наприклад, клацання, переміщення миші або введення тексту на клавіатурі. Інші ініціюються браузером, наприклад, коли сторінка завершує завантаження.

Що таке події (Events)?

Події — це дії, що відбуваються на веб-сторінці і можуть бути сприйняті браузером. Події можуть бути різного типу, наприклад декілька з них:

  • Користувач клікнув мишкою на кнопку → click
  • Навів курсор → mouseover
  • Вивів курсор → mouseout
  • Натиснув клавішу на клавіатурі → keydown, keyup
  • Заповнив інпут → input, change
  • Завантажилась сторінка → load

🧭 Таблиці подій в JavaScript (DOM Events)

📌 Назва події🧠 Тип події📝 Коли спрацьовує
clickМишкаКоли користувач натискає ліву кнопку миші
dblclickМишкаКоли користувач двічі клацає мишею
mousedownМишкаКоли кнопка миші натискається вниз
mouseupМишкаКоли кнопка миші відпускається
mousemoveМишкаКоли курсор миші рухається над елементом
mouseenterМишкаКоли курсор заходить в межі елемента
mouseleaveМишкаКоли курсор виходить за межі елемента
mouseoverМишкаКоли курсор заходить на елемент (спрацьовує включно з внутрішніми елементами)
mouseoutМишкаКоли курсор виходить з елемента (включно з внутрішніми)

📌 Назва події🧠 Тип події📝 Коли спрацьовує
keydownКлавіатураКоли натискається клавіша (спрацьовує одразу)
keypressКлавіатураКоли натискається клавіша, яка друкує символ (застаріле, краще не використовувати)
keyupКлавіатураКоли відпускається клавіша

📌 Назва події🧠 Тип події📝 Коли спрацьовує
inputФорми / інпутКоли користувач вводить або змінює значення в <input>, <textarea>
changeФорми / інпутКоли значення змінилося і фокус пішов з поля (напр., після натискання Tab)
submitФормиКоли користувач відправляє форму
focusФормиКоли елемент отримує фокус (наприклад, курсор в полі вводу)
blurФормиКоли елемент втрачає фокус

📌 Назва події🧠 Тип події📝 Коли спрацьовує
loadВікно / зображенняКоли повністю завантажилась сторінка або зображення
DOMContentLoadedДокументКоли HTML повністю завантажений, без очікування на картинки
resizeВікноКоли змінюється розмір вікна браузера
scrollВікно або блокКоли користувач скролить сторінку або блок
unloadВікноКоли сторінка закривається (застаріла, краще не використовувати)

📌 Назва події🧠 Тип події📝 Коли спрацьовує
dragstartDrag & DropПочаток перетягування
dragDrag & DropПід час перетягування
dragendDrag & DropКоли завершилось перетягування
dragenterDrag & DropКоли перетягуваний елемент заходить в зону приймача
dragoverDrag & DropКоли перетягуваний елемент знаходиться над зоною приймача
dragleaveDrag & DropКоли елемент залишає зону
dropDrag & DropКоли елемент “відпускають”

📌 Назва події🧠 Тип події📝 Коли спрацьовує
contextmenuІншеКоли натискається права кнопка миші
copyКліпбордКоли виконується дія “копіювати”
cutКліпбордКоли виконується дія “вирізати”
pasteКліпбордКоли щось вставляється
touchstartМобільні пристроїКоли палець торкається екрана
touchmoveМобільні пристроїКоли палець рухається по екрану
touchendМобільні пристроїКоли палець відривається від екрана

Додаткові матеріали до теми JavaScript DOM

Базова інформація для початківців, простою мовою пояснена тема: https://www.freecodecamp.org/news/how-to-manipulate-the-dom-beginners-guide/

Добре структуване і спрощене вивчення матеріалу – мені подобається меню справа сторінки, де прописана вся тема по підтемах, тому одразу видно що де шукати і як багато вчити (також є міні-тести що також круто): https://www.w3schools.com/js/js_htmldom.asp

Хороший сайт, де можна детально почитати про цю тему і в кінці статтей є тести, тому разом з ними краще все прочитане запамятовується: https://www.javascripttutorial.net/javascript-dom/

Ще одна стаття на моєму сайті, я розбила тему DOM на список питань – відповідей, такий формат допомагає швидко повторити вивчене: https://victoriaweb.me/javascript-dom-questions-and-answers/

Victoriia Hladka
Victoriia Hladka
https://victoriaweb.me