На этой неделе при создании компонента я наткнулся на проблему, которая заставила задуматься. Нам нужна была кнопка, которая была бы надежной в будущем и перенаправляла пользователей в следующий раздел страницы, независимо от того, каким будет этот раздел.
Для этого варианта использования существует собственная реализация, свойство nextElementSibling
:
var nextNode = elementNodeReference . nextElementSibling ;
Однако собственная опция вернет любой родственный элемент дерева DOM, включая сценарии, стили и другие теги. В моем конкретном случае я искал элементы, которые действительно отображались на странице. Вот основные критерии приемлемости функции, которую мы будем писать:
- Мы хотим, чтобы теги
Наконец, мы добавляем последнюю проверку, чтобы убедиться, что наша функция возвращает значение в элементе (поскольку существует вероятность, что наш текущий элемент является последним в иерархии своих родителей). Вот как выглядит окончательный результат:
функция getElementNextSibling ( элемент ) {
const children = Массив . из ( элемент . parentNode . children );
const братья и сестры = дети . фильтр (( ребенок ) => {
child . nodeType === 1 && child ] . tagName ! == " СКРИПТ " && ребенок . tagName ! == " ССЫЛКА " && ребенок . tagName ! == " СТИЛЬ "
});
const currentElementIndex = братья и сестры . indexOf ( элемент );
const nextElementIndex = currentElementIndex + 1 ;
if ( братья и сестры [ nextElementIndex ]) {
return братьев и сестер [ nextElementIndex ];
} еще {
return null ;
}
}
Работа с IE и ES5
Поскольку метод Array.from
может возвращать ошибку в Interner Explorer даже при использовании Babel, есть последняя модификация, которую мы можем реализовать, чтобы сделать эту функцию совместимой со старыми браузерами (если она включена в вашу целевую аудиторию ):
функция getElementNextSibling ( элемент ) {
const дети = Массив . прототип . срез . вызов ( элемент . parentNode ]. дети );
// все остальное остается прежним
}