2011-11-22 30 views
17

Tôi có một tình huống mà tôi cần phải chọn tất cả con cháu của một phần tử nhất định, nhưng loại trừ container bằng với lớp CSS của vùng chứa tôi chạy bộ chọn của tôi trên đó.Sử dụng jQuery để lấy con cháu của một phần tử không phải là con của một vùng chứa với một lớp CSS nhất định

Mô tả khá phức tạp.

<div class="container"> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"></div> 
    <div class="element"> 
     <div class="container"> 
      <div class="element"></div> 
      <div class="element"></div> 
      <div class="element"></div> 
     </div> 
    </div> 

Chạy một jQuery .find ('yếu tố') trên DIV ngoài cùng sẽ làm cho tôi tất cả các DIV, ngay cả những người bên trong container thứ hai. Đó là những gì tôi cố gắng tránh.

Có giải pháp chọn jQuery nhanh chóng và đơn giản cho trường hợp này không?

+0

Bạn có thể chỉ cho tôi mà yếu tố mà bạn muốn chọn? – BoltClock

+0

Trong trường hợp này, 4 DIV ở cấp 1 với lớp "phần tử" – SquareCat

Trả lời

25

Tôi nghĩ rằng những gì bạn muốn sử dụng là bộ chọn not. Như thế này ..

$(".container").not(".container .container") 

Cách khác, bạn có thể sử dụng bộ chọn children để giúp trẻ em ở một mức độ sâu. Mà sẽ exlclude divs lồng nhau.

Để rõ ràng hơn một chút, tôi nghĩ bạn sẽ muốn sử dụng bộ chọn không sau khi bạn sử dụng 'tìm'. Như thế này:

$(".container").find(".element").not($(".container .container .element")) 

Bạn có thể vượt qua một chức năng để không, vì vậy bạn có thể có mà chức năng nhìn vào cha mẹ của mỗi trận đấu yếu tố để xem nếu nó được lồng vào bên trong của một phần tử với cùng một lớp.

http://jsfiddle.net/QXfs2/6/

removeIfNested = function(index) { 
    // this is the corrent DOM element 
    var $this = $(this), 
     return_value = false; 

    $.each($this.attr('class').split(/\s+/), function(index) { 
     if ($this.parents("." + this).length > 0) { 
      return_value = default_value || true; 
     } 
    }); 

    return return_value; 
} 


$(".container").find(".element").not(removeIfNested); 

Nếu bạn có thể thêm một lớp học để container lồng nhau, đó sẽ là lý tưởng, sau đó nó chỉ là:

$(".container").find(".element").not($(".nested .element")) 

Giả sử bạn thêm lớp "lồng", để bạn bên trong container div.

+0

Điều đó rất tốt để biết! Trong trường hợp cụ thể của tôi, trẻ em() là phù hợp hơn mặc dù. Nhưng cảm ơn rất nhiều vì đã chú ý đến không(). Trong mọi trường hợp, trẻ em() đã thực hiện công việc. Cho đến khi tôi đưa ra một trường hợp có nhiều mức được hỗ trợ. – SquareCat

+0

Tôi thấy rằng tôi đã có trường hợp các DIV được lồng trong các thùng chứa một lần nữa, đó là lý do tại sao tôi phải đổ trẻ em(). Việc sử dụng not() có vẻ như là một ý tưởng hay, nhưng vấn đề là: bộ chọn nào để sử dụng với không() để khớp với vùng chứa cha mẹ (không phải con cái trực tiếp)? – SquareCat

+0

Cảm ơn bạn đã gợi ý đó. Tôi đã thử áp dụng nó nhưng thất bại trong việc làm như vậy. Tôi thấy rằng nó có thể dễ dàng hơn nếu tôi chỉ áp dụng một lớp CSS bổ sung cho tất cả các vùng chứa con cháu, để tôi có thể loại trừ chúng dễ dàng. Nhưng bây giờ tôi không có vẻ để tìm ra những gì chọn để sử dụng để chọn tất cả .container DIV bằng cách sử dụng .find() và để loại trừ tất cả các yếu tố đó là con của một yếu tố với một lớp css cụ thể. - bạn nhanh hơn. Hãy để tôi thử áp dụng giải pháp mới nhất của bạn. – SquareCat

2

Ví dụ cụ thể của bạn này sẽ làm việc -

$("body > div.container > .element") 

Điều đó sẽ chỉ nhận được những divs yếu tố cấp cao nhất. Nếu bộ sưu tập phần tử của bạn có cấu trúc khác, bạn có thể thay thế body bằng id vùng chứa của bộ sưu tập.

Demo - http://jsfiddle.net/QAP37/

+0

Tôi không thể áp dụng giải pháp này mặc dù ví dụ được mô tả ở trên được đơn giản hóa, tình hình thực tế phức tạp hơn một chút. Nhưng cảm ơn bạn. – SquareCat

0

Bạn có thể sử dụng jquery chọn như thế này:

find('*:not(.container .container *)') 
+1

Từ: https://api.jquery.com/all-selector/ .... ** Thận trọng: Bộ chọn tất cả hoặc phổ quát, cực kỳ chậm, ngoại trừ khi được sử dụng bởi chính nó. ** Chỉ để bạn biết ... – Marcky

Các vấn đề liên quan