2010-08-18 24 views
6

Trong jQuery, là bộ chọn $ ('[id = foo]') kém hiệu quả hơn $ ('# foo')?

Trả lời

16
  • ngắn và dễ dàng: !

  • câu chuyện dài (vẫn ngắn thực sự)

    $('[id=foo]') 
    

    sử dụng sizzle (công cụ truy vấn css) để chọn các phần tử trong khi

    $('#foo') 
    

    trực tiếp gọi getElementById.

Để có một câu chuyện rất dài, ở đây chúng tôi đi: $('[id=foo]') là một từ đồng nghĩa với $('*:[id=foo]') trong đó sử dụng bộ chọn phổ biến. Điều đó có nghĩa là nó truy vấn TẤT CẢ các nút trong đánh dấu của bạn và sau đó xem các nút nào trong số đó có id === foo (mà sau đó hy vọng sẽ chỉ khớp với một phần tử, ID = duy nhất). Điều đó tất nhiên, là tốn kém, khá tốn kém. Và đó là lý do tại sao bạn không bao giờ bao giờ nên viết một bộ chọn như thế này! Luôn luôn đủ điều kiện này nếu có thể, như $('span:[id=foo]')

+0

Ahh heres một phụ câu hỏi cho sau đó bạn jAndy - là '$ ('span: [id = foo]') 'chỉ dài tay với' $ (span # foo) 'hoặc một bộ chọn khác hoàn toàn? – HurnsMobile

+0

@HurnsMobile: Không hề. '$ ('span: [id = foo]')'. Tôi thực sự khuyên bạn nên xem qua mã init của jQuery tại đây. jQuery phân tích cú pháp một số biểu thức chọn thành một lệnh gọi trực tiếp 'getElementById' hoặc' getElementsByTagName', tôi nghĩ '$ (span # foo)' là một trong số đó. Vì vậy, nó chắc chắn nhanh hơn '$ ('span: [id = foo]')'. Biểu thức đó sẽ đi vào Sizzle và rõ ràng mất nhiều thời gian hơn một trong các phương pháp được đề cập ở trên. – jAndy

+0

Rất nhiều thông tin, cảm ơn rất nhiều. Lý do tôi đang cân nhắc việc sử dụng thứ gì đó ngoài $ ("# foo") để nhắm mục tiêu id là vì id tôi đang nhắm mục tiêu có một khoảng thời gian trong nó, điều này rõ ràng là có vấn đề vì jQuery sẽ giải thích điều này như một id và một lớp. Vì vậy, bằng cách sử dụng $ ("[id = Address.State]"), ví dụ, tôi có thể nhận được xung quanh vấn đề. Một cách khác để vượt qua nó là tăng gấp đôi thời gian thoát như trong $ ("# Address \\. State"), nhưng tôi nghĩ việc thoát kép có thể ít dễ đọc hơn. Tuy nhiên, do mất hiệu quả mà bạn đã chỉ ra, tôi có thể sử dụng nó. – jbyrd

1

yeah.

Bộ chọn nhanh nhất trong jQuery là ID selector $ ('# foo') vì nó ánh xạ trực tiếp đến một phương thức JavaScript bản địa, getElementById()

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