jQuery: Làm thế nào để đến một đứa con cụ thể của cha mẹ?


92

Để đưa ra một ví dụ đơn giản, tôi đã lặp lại khối sau trên trang rất nhiều lần (nó được tạo động):

<div class="box">
   <div class="something1"></div>
   <div class="something2">
      <a class="mylink">My link</a>
   </div>
</div>

Khi được nhấp, tôi có thể truy cập trang gốc của liên kết bằng:

$(".mylink").click(function() {
   $(this).parents(".box").fadeOut("fast");
});

Tuy nhiên ... tôi cần liên hệ với <div class="something1">cha mẹ cụ thể đó.

Về cơ bản, ai đó có thể cho tôi biết làm thế nào để giới thiệu đến anh chị em cấp cao hơn mà không thể tham khảo trực tiếp được không? Hãy gọi nó là đại ca. Tham chiếu trực tiếp đến tên lớp của người anh lớn sẽ khiến mọi phiên bản của phần tử đó trên trang bị mờ đi - đó không phải là hiệu quả mong muốn.

Tôi đã thử:

parents(".box .something1") ... no luck.
parents(".box > .something1") ... no luck.
siblings() ... no luck.

Bất kỳ ai? Cảm ơn.


Câu trả lời của Anurag có vẻ không phải là câu đúng - nó chắc chắn đã khiến tôi dừng lại và suy nghĩ - nhưng nó chỉ ra một lỗi đánh máy trắng trợn trong mã của bạn khiến bộ chọn của bạn bị lỗi. Bộ chọn, trong jQuery, là .parent() không .parents()
David nói Khôi phục Monica

@ricebowl: Sai. api.jquery.com/ooter
SLaks

@ricebowl ... parent () sẽ cung cấp cho tôi cái gì đó div2, vì vậy tôi cần cha mẹ () để truy cập vào hộp div.
Tom

Ah; lời xin lỗi của tôi. Umm ... Tôi không biết tốt nhất nên để sự thiếu hiểu biết của mình hiển thị, hoặc xóa lỗi để tránh làm phiền lòng ai khác ... = | Tuy nhiên, ít nhất tôi đã học được điều gì đó hữu ích hôm nay; đó là điểm, phải không ..? =)
David nói hãy phục hồi Monica

1
@ricebowl, đừng lo lắng, cảm ơn bạn đã đóng góp.
Tom

Câu trả lời:


144

Việc gọi .parents(".box .something1")sẽ trả về tất cả các phần tử mẹ phù hợp với bộ chọn .box .something. Nói cách khác, nó sẽ trả về các phần tử cha đã .something1và đang ở bên trong .box.

Bạn cần lấy con của cha mẹ gần gũi nhất, như sau:

$(this).closest('.box').children('.something1')

Mã này gọi .closestđể lấy phần tử cha trong cùng phù hợp với một bộ chọn, sau đó gọi .childrenphần tử cha đó để tìm phần chú mà bạn đang tìm.


Tôi biết điều này hơi cũ nhưng không phải là tốt hơn trong trường hợp này nếu sử dụng cha mẹ () thay vì gần nhất () vì tôi tưởng tượng có nhiều duyệt cây hơn với gần nhất () ?
rmorse

1
@acSlater: Anh ấy cần xem qua cây. parent()là phần tử sai.
SLaks

À vâng, đó là cha mẹ (). Parent () mà Tom cần xin lỗi! :)
rmorse

1
@acSlater: Có; rằng sẽ làm việc. Tuy nhiên, nó làm cho Javascript được kết hợp nhiều hơn với cấu trúc HTML. .closest(...)linh hoạt hơn và cũng dễ đọc hơn.
SLaks

8
Trong trường hợp có ai đó đang thắc mắc: sau khi bạn đã tìm thấy cha mẹ phù hợp bằng cách sử dụng .closest (), nếu bạn đang tìm kiếm một phần tử con KHÔNG phải là phần tử con trực tiếp (mà là phần tử con chẳng hạn), chỉ cần sử dụng. find () thay cho .children.
Fabien Snauwaert

17
$(this).parent()

Đi ngang qua cây rất vui

$(this).parent().siblings(".something1");

$(this).parent().prev(); // if you always want the parent's previous sibling

$(this).parents(".box").children(".something1");

Và nhiều cách khác, bạn có thể thấy những tài liệu này hữu ích.


Cảm ơn nhưng không phải tìm kiếm cha mẹ, mà là một đứa trẻ khác của cha mẹ (hoặc thực sự là ông bà).
Tom

Hehe ... đúng là chuyện gia đình.
Tom

13

Thao tác này sẽ tìm lớp cha đầu tiên với lớp, boxsau đó tìm lớp con đầu tiên có đối sánh regex somethingvà lấy id.

$(".mylink").closest(".box").find('[class*="something"]').first().attr("id")

6

Nếu tôi hiểu vấn đề của bạn một cách chính xác, $(this).parents('.box').children('.something1')Đây có phải là những gì bạn đang tìm kiếm?


5

Bạn có thể sử dụng .each()với .children()và một bộ chọn trong ngoặc đơn:

//Grab Each Instance of Box.
$(".box").each(function(i){

    //For Each Instance, grab a child called .something1. Fade It Out.
    $(this).children(".something1").fadeOut();
});
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.