jquery tìm anh chị em gần nhất với lớp


146

đây là html thô tôi có thể làm việc với:

<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>

Tôi cần phải đi qua .current_sub, tìm cái gần nhất trước đó .par_catvà làm mọi thứ với nó.

.find("li.par_cat")trả về toàn bộ tải của .par_cat(tôi đã có khoảng 30 trên trang). Tôi cần nhắm mục tiêu duy nhất.

Sẽ thực sự đánh giá cao bất kỳ lời khuyên :)


7
Wow, mèo thực sự là tất cả trên internet! Bây giờ chúng tôi cũng có mèo con và mèo con.
JD Smith

Câu trả lời:


257

Thử:

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

Đã kiểm tra nó với đánh dấu của bạn:

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

sẽ điền vào trước gần nhất li.par_catvới "woohoo".


cảm ơn Karim Điều này cũng hoạt động tốt, nhưng tôi cho rằng .prev () sẽ ăn ít tài nguyên hơn, vì .prev ALL sẽ nhận được TẤT CẢ các yếu tố phù hợp trước đó và sau đó sẽ lọc cái tôi cần. Chấp nhận câu trả lời của Ed.
daulex

3
Trên thực tế, sau một chút nhắn tin, .prev () đã thất bại trong một vài trường hợp. .prevTất cả với: đầu tiên, làm việc mọi lúc. Cảm ơn bạn.
daulex

1
.prev () chỉ kiểm tra phần tử ngay trước đó. Tôi đã thêm nhận xét vào câu trả lời bên dưới cùng với ví dụ jsFiddle. Sau khi nhìn xung quanh, đây là câu trả lời tốt nhất vì mặc dù nó phải xoay vòng qua tất cả các yếu tố, nhưng nó không yêu cầu hai chức năng để lấy tất cả sau đó lọc để tìm ra nó.
David Hobs

8
Điều này có nghĩa :firstlà đang làm việc trên một danh sách các phần tử được trả về bắt đầu gần nhất với đối tượng được chọn (trái ngược với từ trên xuống dưới so với trang)?
NRzingh

2
Cảm ơn bạn rất nhiều vì câu trả lời rất hữu ích. Bạn có thể vui lòng trả lời câu hỏi @NRadyh không vì nó thực sự làm tôi bối rối. Không phải :firstlà bộ chọn CSS chọn phần tử đầu tiên trong DOM (ví dụ: div.red:firstsẽ chọn DIV màu đỏ đầu tiên trong DOM ), jQuery có phân tích bộ chọn khác nhau không?
Kế toán م

17

Thử

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


19
Đợi đã, cái gì? Điều này không chỉ kiểm tra các yếu tố ngay trước đó? Vì vậy, mã của bạn sẽ trả về null? - Ở đây nó được thử nghiệm trên jsFiddle: jsfiddle.net/Y2TEH
David Hobs

4
@DavidHobs Tôi đã viết cái này hai năm trước .... Tôi chắc chắn sẽ sử dụng trước đó () trong những ngày này.
Ed James

8
@EdWoodcock xem xét cập nhật câu trả lời của bạn, trong trường hợp đó.
Hugo Zink

14

Sử dụng trướcUntil () sẽ cho phép chúng tôi có được anh chị em xa mà không cần phải có tất cả. Tôi đã có một bộ đặc biệt dài quá tốn CPU khi sử dụng trước đó ().

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();

Điều này có được anh chị em trước đầu tiên nếu nó phù hợp, nếu không, nó có anh chị em trước người phù hợp, vì vậy chúng tôi chỉ cần sao lưu thêm một lần nữa với tiền tố () để có được phần tử mong muốn.


5

Tôi nghĩ rằng tất cả các câu trả lời là thiếu một cái gì đó. Tôi thích sử dụng một cái gì đó như thế này

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

Lưu bạn không thêm: đầu tiên bên trong bộ chọn và dễ đọc và dễ hiểu hơn. Phương thức advUntil () cũng có hiệu suất tốt hơn thay vì sử dụng advAll ()


0

Bạn có thể làm theo mã này:

<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>';
}
?>

Bạn có thể lấy ý tưởng từ điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.