2013-04-23 27 views
5

Tại sao bộ chọn :odd không hoạt động khi tôi chuyển nó vào chức năng remove(selector)? Theo số documentation, bộ lọc sẽ lọc bộ mục đã chọn trong trường hợp này là li.Xóa bộ chọn không hoạt động

<ul id='list1'> 
    <li>One</li> 
    <li>Two</li> 
    <li>Three</li> 
    <li>Four</li> 
</ul> 
<ul id='list2'> 
    <li>One</li> 
    <li>Two</li> 
    <li>Three</li> 
    <li>Four</li> 
</ul> 

$(document).ready(function() { 
    $('#list1').children(':odd').remove(); // works as expected 
    $('#list2').children().remove(':odd'); // does not work 
}); 

quả

-One 
-Three 

-One 
-Two 
-Three 
-Four 
+0

[jsfiddle] (http://jsfiddle.net/nX8s2/) đã làm việc cho tôi. Tôi đang sử dụng phiên bản Chrome 26.0.1410.64 m –

+2

@ ThomasC.G.deVilhena: Chuyển sang jQuery 1.9.1. – Blender

+0

@Blender: Oh! Bây giờ tôi thấy. có vẻ như một lỗi ... +1 –

Trả lời

6

Nó thực sự là một lỗi: http://bugs.jquery.com/ticket/13721

Và đã được cố định 17 ngày trước trong jQuery 2.0.

Vấn đề là nó được kiểm tra để xem nếu mỗi phần tử phù hợp bộ chọn:

for element in matched_elements: 
    if element matches the selector: 
     remove element 

:odd chỉ hoạt động trong bối cảnh của một tập hợp các yếu tố phù hợp, vì vậy không ai trong số những yếu tố cá nhân là lẻ. Tương tự, nếu bạn thay đổi nó thành :even, tất cả chúng sẽ bị xóa.

+0

Câu trả lời nhanh chóng và đơn giản +1 –

2

Bộ chọn được chuyển đến remove được sử dụng để khớp với nhau, tức là kiểm tra từng phần tử đối với bộ chọn và loại bỏ từng phần tử khi được so khớp, một phần tử tại một thời điểm. (source code)

Hành vi này đã được thay đổi trong jQuery 2.0, hiện áp dụng bộ lọc chọn trước khi thực hiện xóa. Xem:

#13721: remove(“:nth-child(1)”) works differently than filter(“:nth-child(1)”).remove()


(chỉnh sửa: chỉnh về kết quả giải thích hành vi, @Blender là đúng). Trong trường hợp này, không có sự kết hợp nào với từng phần tử được sử dụng để kiểm tra riêng từng bộ chọn.

Do đó :odd selector sẽ không bao giờ phù hợp như tất cả các yếu tố sẽ được xem xét tại thời điểm chỉ số của đối tượng jQuery 0 (đó là những gì :odd/:even kiểm tra), khi thử với bộ chọn. Điều này giải thích tại sao :odd không bao giờ khớp và :even sẽ khớp với tất cả các phần tử.

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