Cập nhật 2:
Tổng hợp một số ý kiến khác ở đây. Câu trả lời là tùy thuộc vào.
Công cụ chọn của jQuery Sizzle đánh giá bộ chọn giống như cách CSS thực hiện: from right to left. Vì vậy, nói chung nó là tốt hơn để được rất cụ thể về phía bên phải và ít cụ thể ở phía bên trái.
Nhưng nó cũng phụ thuộc vào cấu trúc của HTML và cách phân tán các phần tử mà bạn muốn tìm.
Vì vậy, nếu bạn có
a
|
...
|
b
-----------------
| |
d d d c c c c c c c c c c c c c c c c c c c
sau đó là cụ thể hơn là nhanh hơn $('a b > c')
, bởi vì bạn đang làm giảm các yếu tố thiết lập sớm với b > c
và không cần phải kiểm tra a
thừa kế cho mỗi c
.
Trong khi đó nếu bạn có
a
|
...
|
b
-----------------
| |
e e e e e e e e d d c c c c c c e e e e e e
sau đó $('a c')
sẽ nhanh hơn, kể từ khi chọn đơn giản hơn và thử nghiệm c
cho là một đứa trẻ của b
là không cần thiết trong trường hợp này (tất nhiên bạn có thể thậm chí làm $('c')
).
Original câu trả lời:
Bất kể mà một trong số họ là nhanh hơn, nếu bạn phải truy cập vào một yếu tố hơn và hơn nữa, cửa hàng một tham chiếu đến nó:
var $element = $('#myId .someElement');
$('some other selector').each(function() {
// access $element here
});
The first selector seems to be a bit faster (trong Chrome 8).
Trong các trình duyệt mới hơn (hỗ trợ querySelectorAll
), sự khác biệt có thể không lớn bằng các trình duyệt không hỗ trợ.
Cập nhật:
Tôi nghĩ rằng nó chủ yếu phụ thuộc vào bao nhiêu phương pháp tích hợp jQuery có thể sử dụng.Vì vậy, giả sử querySelector*
không có sẵn, chọn đầu tiên có thể được dịch sang
document.getElementById('myId')[0].getElementsByClassName('someElement')
Đối với bộ chọn thứ hai, jQuery sẽ phải kiểm tra bổ sung cho dù một yếu tố thực sự là một đứa trẻ hay không. I E. có một số xử lý hơn có liên quan.
Không mong đợi kết quả này, điều này chắc chắn là câu trả lời đúng! Cảm ơn – Michael
@Michael: Bạn được chào đón, và xin vui lòng không trực tiếp * đánh dấu * nút trả lời khi câu hỏi của bạn đang hoạt động, đặc biệt là khi có những người như @Felix tham gia ;-) – ifaour
: D Tôi lấy điều này như một lời khen :) Btw. kết quả thú vị. Tôi nghĩ '$ ('# myId .someElement')' sẽ nhanh hơn trong mọi trường hợp, vì nó có thể được dịch trực tiếp sang 'querySelectorAll ('$ myId .someElement')', nhưng có vẻ như '$ ('# myId') .find ('. someElement') 'nhanh hơn rất nhiều. Wow. –