JQuery: prev (<selector>) не работает?
У меня возникли проблемы с использованием prev() в jQuery, где он не выбирает правильный элемент.
Моя структура HTML выглядит следующим образом:
<section id="about">
...
</section>
<hr>
<section id="contact">
...
</section>
"Активный" раздел - #contact. Я хочу выбрать предыдущий раздел, пропущенный через <hr>
active = active.prev('section')
, похоже, не работает. Я думаю, что я, возможно, неправильно читаю документы...
Если я выберу <hr>
, все будет работать красиво. Любые идеи о том, как пропустить <hr>
в prev()?
ТИА
Ответы
Ответ 1
Я думаю, что я, возможно, неправильно читаю документы...
API docs для .prev()
дают это описание:
Описание: Получить непосредственно предшествующий родственный элемент каждого элемента в наборе согласованных элементов, необязательно отфильтрованный селектором.
Итак, проблема в том, что hr
существует и выполняется поиск .prev()
, а затем проверяется на селектор 'section'
.
Любые идеи о том, как пропустить <hr>
в prev()?
Вы можете вызвать .prev()
один раз, чтобы пропустить этот hr
, а затем снова вызвать его для раздела:
active = active.prev().prev('section');
Или используйте .prevAll()
и найдите ближайшую предшествующую (в случае, если перед ней есть другие разделы):
active = active.prevAll('section').first();
Ответ 2
Используйте prevAll() вместо
active = active.prevAll('section')
из документации jQuery:
prev() = > "Получить сразу же предыдущий брат", поэтому он получит только первый элемент, поэтому при удалении <hr>
он будет работать.
Ответ 3
Или попробуйте:
<section id="about">
...
<hr>
</section>
<section id="contact">
...
</section>
Ответ 4
Просто сделай
active = active.prevAll('section').eq(0);
кажется, что .prev() и .next() выбирают только ближайшего брата, независимо от того, предоставили ли вы ему конкретный селектор. Если этот селектор не совпадает с родным братом,.next('section'). Length будет 0.
Поэтому, используя вышеописанный метод, вы получаете всех предыдущих братьев и сестер, соответствующих вашему селектору, и с помощью .eq(0) вы выбираете ближайший.