Узел DOM
Оригинальное название: node
Коротко
Любой объект в дереве документа: элемент, текст, комментарий, сам документ или фрагмент. Узел — базовый тип DOM, от которого наследуются все остальные.
Что такое «Узел DOM»
Когда браузер разбирает HTML, он строит дерево объектов. Каждый тег становится элементом, текст между тегами — текстовым узлом, комментарий — узлом-комментарием, а корнем дерева служит узел документа. Все они реализуют общий интерфейс Node со свойствами parentNode, childNodes, nextSibling и методами вставки и удаления. Элемент — лишь самый заметный вид узла, поэтому понятие узла шире понятия HTML-элемента.
Атрибуты в спецификации тоже описаны как узлы типа Attr, но в дерево они не входят: у атрибута нет родителя, и в childNodes элемента его не найти. Работают с ними через методы элемента — getAttribute() и setAttribute().
Основные типы узлов
1—ELEMENT_NODE, элемент:<div>,<p>.3—TEXT_NODE, текст, включая пробелы и переводы строк между тегами.8—COMMENT_NODE, HTML-комментарий.9—DOCUMENT_NODE, самdocument.11—DOCUMENT_FRAGMENT_NODE, фрагмент — контейнер для подготовки узлов вне страницы.
Пример: узлы и элементы
<ul id="menu">
<li>Главная</li>
<li>Услуги</li>
</ul>
const ul = document.getElementById('menu');
ul.childNodes.length; // 5: три пробельных текста и два li
ul.children.length; // 2: только элементы
ul.firstChild.nodeType; // 3 — текстовый узел
ul.firstElementChild.nodeName; // "LI"
Переводы строк и отступы в разметке попадают в дерево как текстовые узлы. Из-за этого firstChild часто возвращает не первый <li>, а пробельный текст. Если нужны только теги, используют «элементные» варианты: children, firstElementChild, nextElementSibling.
На чём спотыкаются в коде
- Считать NodeList массивом. У
childNodesестьforEach, но нетmapиfilter; при необходимости список превращают в массив черезArray.from(). - Забыть, что список «живой».
childNodesобновляется сам при изменении дерева, а результатquerySelectorAll()— статичный снимок. Удаляя узлы в цикле по живому списку, легко пропустить половину. - Вставлять сотни узлов по одному. Быстрее собрать их в
DocumentFragmentи добавить на страницу одним действием.
Отдельное поддерево со своими узлами, скрытое от основного документа, создаёт Shadow DOM — на нём строятся веб-компоненты.

