2012-12-26 31 views
34

Hãy nói rằng tôi đã sau HTML:jQuery: Tìm phần tử tiếp theo đó không phải là một anh chị em

<span> 
    <span id="x1" class="x">X1</span> 
</span> 
<span> 
    <span> 
     <span id="x2" class="x">X2</span> 
    </span> 
</span> 

$(this)<span id="x1" ...>.

Cách tốt nhất để tìm phần tử tiếp theo phù hợp với .x bằng jQuery là gì?
Cấu trúc của tài liệu thực tế là không thể đoán trước, do đó HTML được cung cấp chỉ là một ví dụ.

Tôi không thể sử dụng nextAll vì nó chỉ tìm thấy anh chị em.
Nếu tôi làm $('.x'), nó sẽ tìm tất cả, nhưng tôi sẽ phải lặp lại/so sánh.
Có giải pháp nào tốt hơn không?

Xem thêm: http://jsfiddle.net/JZ9VW/1/.

Trả lời

40

Chọn tất cả các yếu tố với lớp x, tính toán các chỉ số của phần tử hiện tại và nhận được các phần tử với chỉ số + 1:

var $x = $('.x'); 
var $next = $x.eq($x.index(this) + 1); 

này hoạt động bởi vì các yếu tố được lựa chọn để tài liệu. Bạn chỉ phải chọn tất cả các thành phần .x một lần khi tải trang (nếu chúng không được tạo động).

+1

Cảm ơn, tôi không biết về 'index() '. Tôi sẽ chấp nhận khi SO cho phép tôi (giới hạn thời gian). –

+0

Ý tôi là, '.index' có lẽ chỉ đang lặp qua các phần tử, nhưng ít nhất bạn không phải làm như vậy một cách rõ ràng. AFAIK đây là cách duy nhất nếu bạn không biết bất kỳ mối quan hệ nào khác giữa các nút. –

+0

Đây chính xác là những gì tôi cần; cảm ơn bạn. –

1

Bạn có thể sử dụng xpath:

document.evaluate('following::*[@class="x"], elt, null, XPathResult.ANY_TYPE, null); 

hoặc bạn có thể sử dụng một walker:

var walker = document.createTreeWalker(elt, NodeFilter.SHOW_ELEMENT, function(node) { 
    return node.classList.has('x'); 
}); 

while (walker.nextNode) { 
    do_something_with(walker.currentNode); 
} 
+0

Tôi thấy điểm của bạn, nhưng trừ khi nó là con đường quan trọng (và nó không phải là cho tôi), thêm phức tạp sẽ lớn hơn đạt được hiệu suất. Ngoài ra, bạn có chắc chắn về một số đơn đặt hàng về độ lớn không? Nó sẽ được sử dụng 'querySelector' nội bộ anyway. –

+0

Tôi đồng ý rằng việc xử lý trực tiếp DOM nói chung nhanh hơn, nhưng nếu bạn đưa ra khiếu nại như vậy, bạn nên sao lưu bằng thử nghiệm http://jsperf.com/. –

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