2013-06-04 25 views
5

Tôi đang đọc một cuốn sách và chúng hiển thị một vài ví dụ về cách chọn các phần tử trên DOM, nhưng chúng khuyên luôn sử dụng các phương pháp truy vết Jquery trên bộ chọn, ví dụ: nếu bạn có danh sách bên trong một div thay vì sử dụngJquery duyệt qua và sử dụng các bộ chọn

$("#myList > li") 

Bạn nên sử dụng

$("#myList").children("li") 

Phần lớn thời gian tôi sử dụng đầu tiên trên sau này, tác giả cho biết 2 được ưa thích và hiệu quả hơn nhưng ông không đề cập đến tại sao, bất cứ ai có thể giải thích lý do đằng sau điều này?

+0

Nếu bạn quan tâm đến hiệu suất, bạn không nên sử dụng jQuery chút nào. Sử dụng những gì rõ ràng hơn cho bạn. – Bergi

+0

bản sao có thể có của [hiệu suất bộ chọn jQuery] (http://stackoverflow.com/questions/1411143/jquery-selector-performance) – Bergi

+2

[Đọc này] (https://developers.google.com/speed/docs/best- Thực hành/kết xuất? hl = fr-FR # UseEfficientCSSSelectors) 'Bộ chọn con và lân cận không hiệu quả vì, đối với mỗi phần tử phù hợp, trình duyệt phải đánh giá một nút khác. Nó trở nên đắt gấp đôi cho mỗi bộ chọn con trong quy tắc. Một lần nữa, khóa ít cụ thể hơn, số lượng các nút cần được đánh giá càng lớn. Tuy nhiên, trong khi không hiệu quả, chúng vẫn thích hợp hơn với bộ chọn con cháu về hiệu suất.' –

Trả lời

5

Tôi nghĩ rằng sự khác biệt về hiệu suất trong đó trường hợp cụ thể đi xuống đến này:

document.querySelectorAll('#myList > li'); 
// VS 
document.getElementById('myList').children; 

Và kiểm tra hiệu suất ở đây: http://jsperf.com/ae-d2-56-2a-e2-36-a3-d3-52-74

jQuery có thể kiểm tra để xem nếu nó là một li được chọn nhưng vẫn sẽ nhanh hơn querySelectorAll hoặc Sizzle.

+0

Điều thú vị trong Opera là bộ chọn gốc nhanh hơn khoảng 50% :-) – Bergi

+0

@Bergi: Presto! Bây giờ Blink hai lần ... – elclanrs

+1

jsperf không phải là táo-to-táo, bởi vì nó không lọc trẻ em theo tên thẻ. Làm điều đó, nó chỉ ra rằng 'querySelectorAll' là nhanh nhất. Xem jsperf đã sửa đổi. –

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