2012-10-27 30 views
7

Tôi tự hỏi về chủ đề này trong một thời gian. Các phương pháp trong câu hỏi là những điều sau đây:Làm thế nào đáng tin cậy là "đặt hàng" trong truy vấn NodeLists

  • getElementsByTagName
  • getElementsByClassName
  • getElementsByName
  • querySelectorAll

Theo như tôi biết, những phương pháp DOM là phương pháp duy nhất có thể trả lại được cố định hoặc hiển thị trực tiếp NodeLists. Đối với một số phương pháp, thứ tự được xác định bởi Thông số W3C. Ví dụ, http://www.w3.org viết sau đây cho NodeLists trả về bởi querySelectorAll

Các querySelectorAll() phương pháp trên tài liệu, giao diện DocumentFragment, và Yếu tố phải trả về một NodeList chứa tất cả các phù hợp với các nút phần tử trong subtrees của nút ngữ cảnh, trong đơn đặt hàng tài liệu. Nếu không có nút phù hợp, phương thức phải trả lại một NodeList trống.

Tuy nhiên, tôi không thể tìm thấy thông số rõ ràng tương tự cho các phương pháp khác mà tôi đã đề cập. Câu hỏi của tôi ở đây là:

  • có một thứ tự xác định (thứ tự tài liệu có khả năng nhất) cho kết quả?
  • mức độ đáng tin cậy và trình duyệt chéo được triển khai là các thông số kỹ thuật?

Để trở thành tuyệt đối rõ ràng:

<div>this</div> 
<div>is</div> 
<div>a demo</div> 

// is this always guaranteed to be "<div>is</div>" 
document.querySelectorAll('div')[1] 
+0

+1, câu hỏi rất thú vị. – saji89

+2

Không phân biệt nếu/nó được xác định như thế nào trong spec, hãy tưởng tượng nếu không có lệnh bảo đảm nào. Các tham chiếu được lập chỉ mục sẽ không có ý nghĩa, sẽ bị hủy bỏ từ lâu rồi, và mọi người sẽ đệ quy đi qua tất cả 'childNodes' trong DOM bất cứ khi nào cần đảm bảo chỉ mục. Tôi đã thấy không có gì để chỉ ra để chỉ ra bất kỳ biến thể WRT thứ tự của kết quả. –

+0

... biến thể trong * mà * các phần tử được trả lại là một câu chuyện khác. –

Trả lời

4

Yes. Tất cả chúng đều theo thứ tự tài liệu/trật tự cây.

  • getElementsByName (DOM Level-2-HTML) trả về một NodeList
  • querySelectorAll (Selectors API) trả về một NodeList "trong trật tự tài liệu"
  • getElementsByTagName (DOM) trả về một HTMLCollection
  • getElementsByClassName (DOM) trả về một HTMLCollection

HTMLCollectionsNodeLists đều quy định để có

các yếu tố đều được sắp xếp trong tree order.

khi những người đó được truy cập thông qua số lần hiển thị.

Tôi nghĩ rằng các thông số kỹ thuật đó (mặc dù các phiên bản được liên kết có thể mới hơn một số triển khai) được thực hiện một cách đáng tin cậy bởi tất cả các trình duyệt, chủ yếu là do trật tự cây là thứ tự hợp lý và dễ mã nhất. Tuy nhiên, bạn có thể cần phải chú ý rằng một số trình duyệt có thể trả về các danh sách bao gồm các phần tử khác nhau vì các nút khớp của chúng khác nhau. Tôi có thể nghĩ về một số điều kỳ quặc khi xác định name của một phần tử.

+0

vì vậy đó là cách nó "nên" sau đó. Thế còn việc triển khai thế giới thực? Tôi thực sự cần biết mức độ tin cậy của một loạt các trình duyệt và phiên bản (di động và máy tính) –

+0

Tôi không có số liệu thống kê và chỉ có thể đoán, nhưng tôi chưa bao giờ nghe nói về các trình duyệt khác với nó. Những người lớn làm điều đó đúng cho chắc chắn. – Bergi

+0

Bạn cần biết thuật toán nào để biết đúng thứ tự, btw? – Bergi