JQuery найти ближайший предыдущий брат с классом - PullRequest
138 голосов
/ 22 февраля 2010

Вот грубый 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 на странице). Мне нужно нацелиться на одного.

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

Ответы [ 5 ]

243 голосов
/ 22 февраля 2010

Попробуйте:

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

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

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

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

17 голосов
/ 22 февраля 2010

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

13 голосов
/ 10 ноября 2012

Использование 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 (), чтобы получить нужный элемент.

5 голосов
/ 08 ноября 2016

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

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

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

0 голосов
/ 19 сентября 2018

Вы можете следовать этому коду:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $(".add").on("click", function () {
            var v = $(this).closest(".division").find("input[name='roll']").val();
            alert(v);
        });
    });
</script>
<?php

for ($i = 1; $i <= 5; $i++) {
    echo'<div class = "division">'
        . '<form method="POST" action="">'
        . '<p><input type="number" name="roll" placeholder="Enter Roll"></p>'
        . '<p><input type="button" class="add" name = "submit" value = "Click"></p>'
        . '</form></div>';
}
?>

Вы можете получить представление об этом.

...