2011-12-08 33 views
9

HTML:Tại sao jQuery này trả lại chỉ mục là 3?

<ul> 
    <li class="selected">First Item</li> 
    <li class="disabled">Second Item</li> 
    <li class="separator">Third Item</li> 
    <li>Fourth Item</li> 
</ul> 

jQuery:

alert($("li:not(.disabled,.separator)").index()); 

Theo the documentation cho chỉ số:

giá trị trả về là một số nguyên chỉ ra vị trí của phần tử đầu tiên trong đối tượng jQuery liên quan đến các yếu tố anh chị em của nó.

Nhấn mạnh vào first element. Nhưng mã trên trả về 3. Dựa trên tài liệu không nên mã này trả về 0?

Bạn có thể nhìn thấy nó trong hành động ở đây: http://jsfiddle.net/Zf9Vv/

LƯU Ý:

chọn của tôi phù hợp hai yếu tố: đầu tiên và cuối cùng LI.

+2

Nhấn đinh trên đầu. Bạn đã khám phá ra một sự hồi quy. :) – Jon

+1

Yay cho tôi !!! Bạn có thể xem vé tại đây: http://bugs.jquery.com/ticket/10977 –

+0

Dựa trên những phát hiện của tôi (xem [answer] (http://stackoverflow.com/a/8424662/50079)), tôi nghĩ rằng vé là sai lầm. Đây là một hồi quy được giới thiệu trong 1.6.3 và nên được báo cáo như vậy. Có (tất nhiên) không có gì trong các ghi chú phát hành 1.6.3 chỉ ra rằng hành vi được ghi lại của 'index()' sẽ thay đổi. – Jon

Trả lời

5

Chỉnh sửa (xem nhận xét) Câu trả lời ban đầu là không đúng ... Tôi sẽ giữ nó ở đây bây giờ để nhận xét có ý nghĩa.

Nhìn vào nguồn jQuery cho index, bạn sẽ nhìn thấy following snippet:

if (!elem) { 
    return (this[0] && this[0].parentNode) ? this.prevAll().length : -1; 
} 

Hãy so sánh này để tương ứng (nếu rất khác nhau) đoạn mã từ một bản phát hành trước đó, 1.6.2. Lưu ý việc sử dụng this[0]:

return jQuery.inArray(this[0], 
// If it receives a string, the selector is used 
// If it receives nothing, the siblings are used 
elem ? jQuery(elem) : this.parent().children()); 

Dường như trong phiên bản hiện tại phần this.prevAll gây ra vấn đề. Nếu bạn thay đổi nó thành this.eq(0).prevAll (để sao chép trạng thái tài liệu index) thì bạn sẽ nhận được giá trị chính xác được trả về. Vì vậy, nó sẽ xuất hiện đây là một lỗi jQuery.

Trong phiên bản 1.6.2, inArray được sử dụng. Phương thức đó trả về chỉ mục của đối số đầu tiên trong đối số thứ hai (hoặc -1 nếu đối số đầu tiên không được tìm thấy trong lần thứ hai). Đối số đầu tiên là this[0] (phần tử đầu tiên trong tập hợp đã khớp), chúng tôi nhận được kết quả mong đợi.

Dưới đây là một updated fiddle với nguồn jQuery đã sửa đổi đi kèm. Kết quả chính xác được cảnh báo.


Original câu trả lời (điều này là không chính xác):

Đọc phần trích dẫn của các tài liệu một lần nữa một cách cẩn thận (làm nổi bật đậm thêm):

giá trị trả về là một số nguyên cho biết vị trí của phần tử đầu tiên trong đối tượng jQuery liên quan đến các phần tử anh chị em của nó.

Chỉ vì hai trong số các anh chị em đã bị xóa khỏi tập hợp phù hợp, nó không thay đổi giá trị trả về bởi index. Nói cách khác, phần tử phù hợp (<li>Fourth Item</li>) sẽ luôn có chỉ mục 3, liên quan đến các anh chị em của nó (trừ khi, tất nhiên, các anh chị em mới được chèn vào DOM trước phần tử được đề cập).

+2

Nhưng kể từ lần đầu tiên và cuối cùng 'LI' được kết hợp nên nó chọn đầu tiên (trong đó có một chỉ số 0)? –

+0

Ahh, tôi hiểu ý của bạn là gì. Tôi sẽ xem xét nó vì vậy tôi sẽ không xóa câu trả lời của tôi. –

+0

Tôi đã xem xét cùng một lúc ngay bây giờ, +1 để xuất bản sự kiện. – Jon

4

Có thể bạn đã tìm thấy sự khác biệt giữa chức năng jQuery thực tế và tài liệu nói gì.

Các docs bang

Nếu không có tham số được truyền cho phương thức .index(), giá trị trả về là một số nguyên chỉ ra vị trí của phần tử đầu tiên trong đối tượng jQuery tương đối so với anh chị em của nó elements.`

Tuy nhiên, .index() được trả lại chỉ số của yếu tố cuối cùng trong đối tượng jQuery.

này có thể được chứng minh (không giới thiệu một vấn đề tiềm năng với: không chọn) trong fiddle của bạn bằng cách console.log($("li").index()); // 3

Có lẽ một báo cáo lỗi trên jQuery là cần thiết?

+1

** Mọi người, đây không phải là vấn đề về tài liệu. Đó là một sự hồi quy. ** – Jon

+0

Điều đó có hướng vào tôi không? Tôi không nói đó là vấn đề về tài liệu, nhưng đó là sự khác biệt giữa chức năng và tài liệu thực tế. – simshaun

+0

Nó chủ yếu hướng vào những người updoters tâm lý đàn, nhưng nó có thể áp dụng cho bạn cũng như ý nghĩa câu trả lời để lại ấn tượng rằng điều này cần được sửa bằng cách thay đổi tài liệu. – Jon

4

Cập nhật:

xác nhận, đây là một hồi quy giới thiệu trong jQuery 1.6.3. Các phiên bản trước đó thể hiện hành vi mong đợi (trả về 0).

Sau khi điều tra, tôi đã miễn cưỡng đi đến kết luận rằng điều này không thể là bất cứ điều gì khác ngoài lỗi trong jQuery.

Cụ thể, trong trường hợp này ít nhất, index() trả về chỉ mục tương ứng với các anh chị em của phần tử thứ hai được so khớp (số <li>). Điều này mặc dù thực tế là

$("li:not(.disabled,.separator)").get(0) 

trả lại chính xác <li class="selected">.

Hơn nữa, nếu chúng ta thay đổi selector để

$("li:not(.disabled,.separator,:last-child)").index() 

sau đó index trả về đúng 0.

Các xét nghiệm được thực hiện sử dụng jQuery 1.7.1

+0

Có, sau khi thử nghiệm điều này thực sự là một lỗi trong jQuery. Cuộc gọi tốt. – Alex

+1

@ Alex: Tôi đã thử nghiệm và xác định chính xác 1.6.3 là bản phát hành có tội. Bây giờ chúng ta hãy tìm hiểu những gì đã xảy ra :) – Jon

+0

@Jon - Có vẻ như những gì đã xảy ra là thay đổi từ 'this [0]' thành 'this' (trong số nhiều thay đổi khác - mã hoàn toàn khác trong phiên bản mới nhất). Xem câu trả lời (cập nhật) của tôi. –

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