2010-02-22 3 views
129

вот грубый HTML я работаю с:JQuery найти ближайший предыдущий родственный с классом

<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 на странице). Мне нужен целевой сингл.

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

+4

Ничего себе, кошки действительно находятся по всему Интернету! Теперь у нас есть пар и кошки. –

ответ

225

Try:

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

Испытано его с разметкой:

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

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

+0

спасибо Карим. Это тоже хорошо работает, но я предполагаю, что .prev() будет потреблять меньше ресурсов, так как .prevAll получит ВСЕ предыдущие согласованные элементы, а затем будет фильтровать тот, который мне нужен. Принимая ответ Эд. – daulex

+3

На самом деле, после небольшого текстового сообщения, в .prev() не удалось выполнить несколько экземпляров. .prevAll с: во-первых, работал каждый раз. Спасибо. – daulex

+1

.prev() проверяет только предшествующий элемент. Я добавил комментарий к ответу ниже вместе с примером jsFiddle. Оглянувшись, это лучший ответ, поскольку, хотя он должен циклически перемещаться по всем элементам, он не требует двух функций, чтобы захватить все фильтры, чтобы найти его. –

18

Попробуйте

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

+0

doh, отлично работал, это было намного проще, чем я думал. Спасибо. – daulex

+0

Нет проблем: у всех нас есть эти моменты;) –

+15

Подождите, что? Разве это не проверяет только предыдущий элемент? Таким образом, ваш код вернет значение null?- Здесь он протестирован на jsFiddle: http://jsfiddle.net/Y2TEH/ –

10

Использование 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(); 

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

3

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

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

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

Смежные вопросы