Với đánh dấu mẫu này (giả sử một số ngẫu nhiên của các yếu tố giữa .outer
và .inner
:jQuery lọc chọn để loại bỏ các yếu tố lồng nhau phù hợp với mô hình
<div class="outer">
<div>
<div>
<div class="inner"></div>
</div>
</div>
</div>
tôi có thể thiết lập jQuery để chọn divs bên ngoài và bên trong như vậy:
$outer = $('.outer');
$inner = $outer.find('.inner')
trình tốt.
Tuy nhiên, chúng ta hãy nói rằng tôi muốn cho phép một tổ không giới hạn của logic này, vì vậy tôi có thi s:
<div class="outer"> div a
<div class="inner"> div b
<div class="outer"> div c
<div class="inner"> div d </div>
</div>
</div>
</div>
Trong trường hợp đó, khi chọn div a qua .outer
Tôi muốn khớp nó với chỉ div b. Trong các từ khác, tôi muốn loại trừ tổ tiên của tổ tiên lồng nhau .outer
.
Tôi muốn có các phần vỏ bên ngoài và bên trong được chứa trong mức lồng của chúng.
Tôi hy vọng .filter()
có thể xóa nó đi, nhưng không thể nghĩ ra một bộ chọn sẽ hoạt động phổ biến cho các mẫu lồng nhau không giới hạn. Có thể sử dụng bộ lọc không? Hoặc thậm chí có thể là một mẫu chọn trực tiếp?
UPDATE:
Tôi nghĩ rằng một cái gì đó như thế này có thể làm việc, nhưng không chắc chắn như thế nào người ta có thể (hoặc nếu nó cho phép) tham chiếu 'này' trong một selector:
$outer = $('.outer');
$inner = $outer.not('this .outer').find('.inner')
UPDATE 2:
Tôi nên đề cập đến điều này một cách trực tiếp: .inner
sẽ luôn là hậu duệ của .outer
nhưng không nhất thiết là một đứa trẻ ngay lập tức.
CẬP NHẬT 3:
Đây là một số mẫu thử HTML có thể được sử dụng. Trong mỗi trường hợp, tôi muốn có thể chọn .outer và ghép cặp .inner của nó chứa giữa chính nó và bên ngoài lồng nhau. Để rõ ràng, tôi đã thêm tên cho mỗi div (cặp bên ngoài-x với nội-x)
//sample 1
<div class="outer"> outer-a
<div>
<div class="inner"> inner-a
<div class="outer"> inner-b
<div class="inner"> inner-b </div>
</div>
</div>
</div>
<div>
<div class="inner"> inner-a </div>
</div>
</div>
//sample 2
<div class="outer"> outer-a
<div class="inner"> inner-a
<div class="outer"> inner-b
<div>
<div class="inner"> inner-b </div>
</div>
</div>
</div>
</div>
//sample 3
<div class="outer"> outer-a
<div class="inner"> inner-a
<div class="outer"> inner-b
<div class="inner"> inner-b
<div class="outer"> outer-c
<div class="inner"> inner-c</div>
</div>
</div>
</div>
</div>
</div>
//bonus sample (we're trying to avoid this)
<div class="outer"> outer-a
<div class="inner outer"> inner-a outer-b
<div class="inner"> inner-b </div>
</div>
</div>
CẬP NHẬT 4
Tôi nghĩ rằng tôi đã kết thúc đi xuống một con đường tương tự như gnarf. Tôi đã kết thúc với điều này:
var $outer = $('.outer');
var $inner = $outer.find('.inner').filter(function(){
$(this).each(function(){
return $(this).closest('.outer') == $outer;
});
});
Tôi có đi đúng hướng không? Nó không hoạt động vì vậy tôi cho rằng tôi vẫn còn một chút lỗi logic.
này không có ý nghĩa - ngay cả khi bạn kết hợp tổ đầu tiên và duy loại bỏ điều đó - con cái của nó sẽ bị loại bỏ anyway – Matt