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) вы выбираете ближайший.