Giả sử tôi có HTML sau:Chọn yếu tố trừ khi nó có một tổ tiên của một lớp được sử dụng chỉ là một selector
<div class="foo">
<ul>
<li>One</li>
<li>Two</li>
</ul>
</div> <!-- not originally here -->
<div class="bar">
<ul>
<li>Three</li>
<li>Four</li>
</ul>
</div>
Tôi muốn chọn tất cả li
yếu tố đó là không hậu duệ của một phần tử với class foo
. Tôi biết tôi có thể làm điều đó với một ưa thích filter function, nhưng tôi tự hỏi liệu tôi có thể làm điều đó chỉ với một bộ chọn. Đầu tiên tôi đã cố gắng:
$(":not(.foo) li")
Thật không may điều này không làm việc kể từ khi li
có tổ tiên khác mà không có phong cách (các ul
trong trường hợp này). Sau đây dường như làm việc;
$(":not(.foo) :not(.foo) li")
Nói cách khác, chọn tất cả li
yếu tố mà không có tổ tiên mà một trong hai có lớp foo
hoặc có tổ tiên của riêng của mình với lớp foo
. Có lẽ đây là cách tốt nhất/duy nhất để làm điều đó với một bộ chọn, nhưng tôi không hồi hộp về sự lặp lại của bộ chọn :not
. Có ý tưởng nào tốt hơn không?
Vấn đề ở đây là ': không (.foo) li' không có nghĩa là "'li' mà không có tổ tiên có lớp 'foo'".Nó có nghĩa là "' li' có một tổ tiên không có lớp 'foo'". Sự khác biệt có vẻ tinh tế, nhưng nó thực sự là một sự khác biệt rất lớn. – BoltClock
Đúng vậy. Và cái thứ hai có nghĩa là 'li' có một tổ tiên không có lớp' foo' AND không có tổ tiên của riêng nó với lớp 'foo'. Mà tôi nghĩ là kết quả đúng, nhưng là một cách khá xấu xí và không hài lòng để đạt được điều đó. –