Определение индекса дочернего узла в JavaScript без jQuery
Быстрый ответ
Для быстрого определения индекса дочернего узла используйте метод .indexOf, применив его к коллекции .children родительского элемента:
const index = Array.from(parentNode.children).indexOf(childNode);
Данный метод позволяет узнать позицию childNode среди потомков parentNode.children, используя функцию .indexOf().

Эффективные альтернативы циклам
Помимо основного способа, существуют альтернативные подходы, которые позволяют избежать использования обычных циклов:
Использование встроенных методов — выбор в пользу краткости и ясности:
JSСкопировать кодconst index = Array.prototype.indexOf.call(parent.children, child);Метод
callпозволяет функцииindexOfработать напрямую с псевдомассивомchildren.Применение возможностей ES6 — придание коду элегантности:
JSСкопировать кодconst index = [...parent.children].indexOf(child);Оператор расширения помогает преобразовать
childrenв массив, после чего можно использовать методindexOf.
Обход трудностей при использовании
Методы могут испытывать проблемы в следующих ситуациях:
- Если
childNodeне является прямым потомком,indexOfвсегда возвращает-1. - При работе с текстовыми узлами предпочтительнее использовать
childNodesвместоchildrenи исключить узлы, не являющиеся элементами.
Альтернативные подходы к обходу DOM
Если преобразование children в массив невозможно, можно использовать свойство previousElementSibling:
function getChildIndex(child) {
let index = 0;
while ((child = child.previousElementSibling) != null)
index++;
return index;
}
С помощью previousElementSibling можно исследовать предыдущих "братьев" элемента.
Визуализация
Пример, демонстрирующий поиск индекса дочернего узла:
Имеется семейное фото (👨👩👧👦), и вам нужно определить позицию второго ребенка.
Формация: [👦, 👧, 👶, 👧]
Применяем .indexOf() к массиву детей, чтобы найти нужного нам ребенка (👶):
let children = parent.childNodes;
let secondChild = children[2];
let childIndex = Array.prototype.indexOf.call(children, secondChild);
console.log(childIndex);
На примере:
Идеальная поза: [👦(0), 👧(1), 👶(2), 👧(3)]
Искомый ребенок: 👶
Результат: 👶 занимает позицию под индексом 2.
Визуализация помогает понять уникальную позицию узла в последовательности, словно место ребенка на семейном фото.
Будьте осторожны с совместимостью
Необходимо учитывать совместимость с разными версиями браузеров:
- Современные браузеры хорошо справляются с предложенными методами, в отличие от устаревших.
- Будьте осторожны при использовании нестандартных свойств, таких как
parentIndex— они могут влиять на кросс-браузерную совместимость.
Использовать jQuery или нет
Несмотря на удобство использованиия методов jQuery, как .index(), чистый JavaScript обеспечивает большую скорость и не требует подключения внешних библиотек. ES6 предлагает эффективные средства для работы с DOM без использования jQuery.
Восхищение производительностью и эволюцией JavaScript
Новшества в JavaScript, такие как оператор расширения и Array.prototype.from, значительно упрощают выполение задач по определению индекса узла, делая код более читаемым и эффективным.
Инструменты для вашего арсенала
- В общих случаях
indexOfи преобразование в массив являются предпочтительными. - При необходимости поддержки старых браузеров стоит освоить обход с использованием свойств соседних элементов.
- Для исключения текстовых узлов предпочтительно использовать
childrenвместоchildNodes.
Полезные материалы
- Node: свойство childNodes – Web API | MDN — Глубокое изучение свойства
childNodes. - javascript – Получить индекс дочернего узла – Stack Overflow — Сборник примеров и методов для определения индекса дочернего узла.
- Node: свойство parentNode – Web API | MDN — Информация о родительских узлах в DOM.
- Element: свойство children – Web API | MDN — Руководство по свойству
children, включая его различия сchildNodes. - Узлы DOM в JavaScript — Обзор работы с узлами HTML DOM в JavaScript.
- Введение в DOM | DigitalOcean — Обзор основ DOM.
- Основы работы с DOM в чистом JavaScript (без jQuery) — SitePoint — Руководство по манипуляции DOM без использования jQuery.


