Jquery найти ближайший предыдущий родной с классом

вот грубый html, с которым я работаю:

<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li> // this is the single element I need to select
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat current_sub"></li> // this is where I need to start searching
<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li>

Мне нужно перейти от .current_sub, найти ближайший предыдущий .par_cat и сделать материал для него.

.find("li.par_cat") возвращает всю загрузку .par_cat (у меня около 30 на странице). Мне нужен целевой сингл.

Поистине буду признателен за любые советы:)

Ответ 1

Try:

$('li.current_sub').prevAll("li.par_cat:first");

Протестировано с помощью вашей разметки:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo");

заполнит ближайший предыдущий li.par_cat "woohoo".

Ответ 2

Try

$('li.current_sub').prev('.par_cat').[do stuff];

Ответ 3

Использование prevUntil() позволит нам получить далекого брата без необходимости получать все. У меня был особенно длинный набор, который был слишком интенсивным с использованием prevAll().

var category = $('li.current_sub').prev('li.par_cat');
if (category.length == 0){
  category = $('li.current_sub').prevUntil('li.par_cat').last().prev();
}
category.show();

Это соответствует первому предшествовавшему брату, если он соответствует, в противном случае он получает дочерний элемент, предшествующий тому, который соответствует, поэтому мы просто создаем резервную копию еще одним символом prev(), чтобы получить желаемый элемент.

Ответ 4

Я думаю, что во всех ответах чего-то не хватает. Я предпочитаю использовать что-то вроде этого

$('li.current_sub').prevUntil("li.par_cat").prev();

Сохраняет, что вы не добавляете: сначала внутри селектора, и его легче читать и понимать. Кроме того, метод prevUntil() имеет более высокую производительность, чем использование prevAll()