JavaScript Node — вузол DOM-дерева
Node (у перекладі — вузол) — базовий клас усього, що є в DOM-дереві: елементів, текстових вузлів, коментарів, самого документа.
Загальний опис
Тут криється пастка, на якій спотикаються всі новачки. У дереві живуть не лише теґи: пробіли й переноси рядків між ними — це теж вузли, текстові.
Звідси різниця, яку треба знати напам'ять:
childNodesвіддає всі вузли — разом із текстовими «порожніми» проміжками;childrenвіддає лише елементи — теґи.
Тому element.childNodes.length у гарно відформатованій розмітці майже завжди більше, ніж очікуєш. У 99% випадків потрібні саме children, firstElementChild, nextElementSibling.
Тип вузла визначає nodeType: 1 — елемент, 3 — текст, 8 — коментар.
- Порада
-
Правило просте: працюєш із теґами — бери властивості зі словом Element (
автор: NagarDchildren,firstElementChild). Без нього — отримаєш пробіли між теґами.
Синтаксис
element.parentNode;
властивості
| Властивість | Опис |
|---|---|
| childNodes | Усі дочірні вузли, включно з текстовими. |
| firstChild | Перший дочірній вузол. |
| lastChild | Останній дочірній вузол. |
| nextSibling | Наступний сусідній вузол. |
| previousSibling | Попередній сусідній вузол. |
| parentNode | Батьківський вузол. |
| parentElement | Батьківський елемент (або null). |
| nodeName | Назва вузла: ім'я тега, #text, #comment. |
| nodeType | Числовий тип вузла: 1 — елемент, 3 — текст… |
| textContent | Текстовий вміст вузла і всіх нащадків. |
| isConnected | Чи під'єднаний вузол до документа. |
методи
| Метод | Опис |
|---|---|
| appendChild | Додає вузол у кінець дітей. |
| removeChild | Видаляє дочірній вузол. |
| insertBefore | Вставляє вузол перед заданою дитиною. |
| replaceChild | Замінює дочірній вузол іншим. |
| cloneNode | Клонує вузол; з true — разом із нащадками. |
| contains | Чи є вузол нащадком цього. |
| hasChildNodes | Чи має вузол дітей. |
Переглядачі
| Переглядач | ||||||
|---|---|---|---|---|---|---|
| Node | 1+ | 1+ | 1+ | 7+ | 12+ | 5+ |
| Переглядач | ||||
|---|---|---|---|---|
| Node | yes | yes | yes | yes |
Приклади
+ запропонувати свій приклад у пісочниці
Та сама пастка: childNodes бачить пробіли, children — ні.
HTML
<ul id="list">
<li>Перший</li>
<li>Другий</li>
</ul>
JS
const list = document.getElementById('list');
// пробіли й переноси між <li> — теж вузли!
console.log(list.childNodes.length); // 5
console.log(list.children.length); // 2 — лише теґи
console.log(list.firstChild.nodeType); // 3 — текст (перенос рядка)
console.log(list.firstElementChild.nodeType); // 1 — елемент <li>
// створення й вставка
const item = document.createElement('li');
item.textContent = 'Третій';
list.append(item);
// перевірка вкладеності
console.log(list.contains(item)); // true
Коментарі
Коментарів ще немає — будьте першим!