2012-07-28 34 views
21

Tôi đã hy vọng $('#childDiv2 .txtClass') hoặc $('#childDiv2 input.txtClass') hoạt động tốt hơn khi chọn yếu tố <input type="text" id="txtID" class="txtClass"/>. Nhưng theo điều này performance analysis$('.txtClass'); là bộ chọn tốt nhất trong số này. Tôi đang sử dụng JQuery 1.7.2 Có ai có lời giải thích cho điều này?Phần tử Jquery + hiệu suất chọn lớp

Performance analysis for class selectors

HTML

<div class="childDiv2"> 
    <input type="text" id="txtID" class="txtClass"/> 
    <p class="child">Blah Blah Blah</p> 
</div>​ 

JS

$('.txtClass'); 
$('#childDiv2 .txtClass') 
$('#childDiv2 > .txtClass') 
$('input.txtClass') 
$('#childDiv2 input.txtClass') 
+0

Vì id phải là duy nhất, cách nhanh nhất sẽ là '$ (" # txtID ")' – Andreas

+0

Quan tâm của tôi được chọn theo kịch bản lớp? – Lanka

+0

Câu hỏi hay. Tôi không có câu trả lời, nhưng nó tò mò muốn thấy rằng thậm chí đưa ra một bối cảnh $ ('. TxtClass', '# childDiv2') vẫn còn chậm hơn so với bộ chọn lớp. –

Trả lời

36

Trình duyệt hiện tại phơi bày một getElementsByClassName() phương pháp rất hiệu quả mà trả về các yếu tố có một lớp nhất định. Đó là lý do tại sao một bộ chọn lớp đơn nhanh hơn trong trường hợp của bạn.

Để xây dựng trên ví dụ của bạn:

$(".txtClass")     => getElementsByClassName() 

$("#childDiv2 .txtClass")  => getElementById(), 
            then getElementsByClassName() 

$("#childDiv2 > .txtClass")  => getElementById(), 
            then iterate over children and check class 

$("input.txtClass")    => getElementsByTagName(), 
            then iterate over results and check class 

$("#childDiv2 input.txtClass") => getElementById(), 
            then getElementsByTagName(), 
            then iterate over results and check class 

Như bạn thấy, nó khá hợp lý cho hình thức đầu tiên là nhanh nhất trên các trình duyệt hiện đại.

+0

Vì vậy, những gì tôi có thể nói là hầu như mọi hướng dẫn về hiệu suất jquery được tìm thấy trên web đều không chính xác. Ngay cả các hướng dẫn của một số kẻ jquery như [Addy Osmani] (http://addyosmani.com/jqprovenperformance/) – Lanka

+3

@Lanka, có thể không * không chính xác *, chỉ * lỗi thời *. Công nghệ tuần hành trên, và lời khuyên hiệu suất tốt nhất hiện nay có thể rất tốt vào năm tới. Mặt khác, điểm chuẩn sẽ cung cấp cho bạn số cập nhật. –

+0

Đúng vậy. Trên thực tế tôi đã sai trong bình luận trước đây của tôi. Anh chàng đó đã giải thích nó trong các slide. – Lanka

5

Bộ chọn CSS được phân tích cú pháp từ phải sang trái. Vì vậy, ví dụ của bạn

$('#childDiv2 .txtClass') 

sẽ thực hiện hai hành động để hoàn tất. Trước tiên, hãy tìm tất cả các phần tử có lớp txtClass. Sau đó kiểm tra từng phần tử để trở thành phần tử con của phần tử có id là childDiv2.

$('.txtClass') 

Bộ chọn này sẽ chỉ thực hiện một hành động. Tìm tất cả các yếu tố với lớp txtClass

Có một cái nhìn tại this article trên css-tricks.com

+0

Vì tôi biết sizzle tối ưu hóa truy vấn này. Vì vậy, nó hoạt động khác với lời giải thích của bạn. Đầu tiên, hãy chọn childDiv2 và sau đó tìm kiếm txtClass trong đó là con. – Lanka

+0

thực sự, dòng mã đầu tiên được hiển thị yêu cầu kiểm tra từng phần tử .txtClass để xem liệu nó có phải là DESCENDANT của # childDiv2 hay không. Điều đó đòi hỏi phải kiểm tra TẤT CẢ các tổ tiên của mỗi .txtClass. – ToolmakerSteve

1

Hình như nó cũng phụ thuộc vào mật độ của các yếu tố với lớp giữa các yếu tố của các loại.

Tôi đã chạy thử nghiệm với Google Chrome Phiên bản 30.0.1599.69 bằng cách sử dụng JQuery 1.10.1. Hãy thử nó trên một trình duyệt khác và/hoặc sử dụng một phiên bản JQuery khác.

tôi đã cố gắng để chạy các xét nghiệm sau đây:

  1. thưa thớt (10% của div có class) link to the test on jsbin

  2. Rậm (90% của div có class) link to the test on jsbin

Có vẻ như trong Trường hợp đặc biệtdiv.class sẽ thắng, nhưng trong số Trường hợp thưa thớt.class thắng.

+0

Giống như nhận xét đề cập đến dày đặc/thưa thớt, điều này thường bị bỏ qua. Không có viên đạn bạc ngoài việc sử dụng một id nếu bạn có thể. –

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