Trong jQuery, là bộ chọn $ ('[id = foo]') kém hiệu quả hơn $ ('# foo')?
Trả lời
ngắn và dễ dàng: CÓ!
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]')
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()
- 1. So sánh hiệu suất của $ ("# foo .bar") và $ (". Bar", "#foo")
- 2. Foo f = Foo(); // không có hàm nào phù hợp để gọi đến 'Foo :: Foo (Foo)' ... huh?
- 3. Bộ chọn jQuery, hiệu quả
- 4. Là Foo * f = mã Foo tốt Foo tốt
- 5. char * foo vs char * foo
- 6. "new Foo() {}" và "new Foo()" trong Java
- 7. Sự khác biệt hiệu suất, nếu có, giữa if (! Foo) và if (foo == false) trong Java?
- 8. Bộ chọn CSS cho "foo có chứa thanh"?
- 9. Có phải "x = new (Foo)" giống như "x = new Foo" cho một Foo tùy ý không?
- 10. Tên tệp tuyệt đối ("/ foo") và tương đối ("../foo"). Danh mục "foo" được gọi là gì?
- 11. Tại sao "foo" .toString() không giống với toString.call ("foo")?
- 12. Tốc độ PHP: tốc độ nhanh hơn là gì? if (isset ($ foo)) HOẶC nếu ($ foo == true)
- 13. Tại sao thanh 'foo bar' và 'foo>' có cùng đặc tính trong CSS?
- 14. Foo trong AS3 là gì?
- 15. Tên của tính năng [foo, bar] = ["foo", "bar"] là gì?
- 16. scala: 'foo def = {1}' vs 'foo def {1}'
- 17. Sự khác biệt giữa "if (foo) bar();" và "foo && bar();"
- 18. @ManyToMany (mappedBy = "foo")
- 19. Khi nào thì QLC kém hiệu quả hơn nhiều?
- 20. svn: URL <foo> của dierctory <foo> hiện không khớp với URL mong muốn <foo>
- 21. Sử dụng lũy thừa ** 0,5 kém hiệu quả hơn math.sqrt?
- 22. "x && foo()" là gì?
- 23. Để foo bar, hoặc không để foo bar: đó là câu hỏi
- 24. Có sự khác biệt nào giữa [& foo] {...} và chụp [foo] {...} nếu 'foo' là biến tham chiếu không?
- 25. RavenDB chọn hiệu suất kém
- 26. Điểm của câu nói "#define FOO FOO" trong C là gì?
- 27. Tại sao nó không được phép trong Java để quá tải Foo (Object ...) với Foo (Object [])?
- 28. Dự án PS ($ Foo) trong giải pháp $ Foo ATL của tôi là gì?
- 29. @synthesize foo = _foo là gì?
- 30. Sử dụng từ điển <Foo, Foo> Thay vì danh sách <Foo> để tăng tốc cuộc gọi để chứa()
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
@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
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