У последнего элемента следующего нет, так что в качестве
nextElementSibling
вы получаете
null
, а у
null
нельзя читать свойства. Как победить возникающую ошибку? - проще всего будет вообще не трогать последний элемент, пусть цикл делает на одну итерацию меньше, для этого замените
i < children.length
на
i < children.length - 1
. Другой вариант - прежде чем пытаться читать свойства у следующего элемента, проверять, существует ли он, или не является ли текущий последним, или подсовывать вместо отсутствующего элемента пустой объект - актуально в том случае, если перебор элементов организован не через цикл со счётчиком, а с помощью
for...of
или методов.
Ещё стоит разобраться, чем присваивание отличается от проверки на равенство (
nodeName = 'P'
, ну да, ну да).
Как может выглядеть исправленная (и переписанная) функция:
function findAllPSiblings(el) {
const result = [];
for (const n of el.children) {
if ((n.nextElementSibling || {}).tagName === 'P') {
result.push(n);
}
}
return result;
}
А вообще, зачем ограничиваться одними лишь
p
? Давайте решим задачу в чуть более общем виде - пусть функция кроме родительского элемента принимает ещё и селектор, которому должны соответствовать соседи справа:
const getChildrenWithNext = (el, selector) =>
Array.prototype.filter.call(
el.children,
({ nextElementSibling: n }) => n && n.matches(selector)
);