Trẻ em nhanh nhất () hoặc find () trong jQuery là gì?


320

Để chọn một nút con trong jQuery, người ta có thể sử dụng children () nhưng cũng có thể tìm ().

Ví dụ:

$(this).children('.foo');

cho kết quả tương tự như:

$(this).find('.foo');

Bây giờ, tùy chọn nào là nhanh nhất hoặc ưa thích và tại sao?


27
.find().children()không giống nhau Cái sau chỉ đi một cấp xuống cây DOM, giống như bộ chọn con.
Timothy003

1
@ Timothy003 Bạn đã mô tả nó sai, cái trước đi xuống một cấp chứ không phải cái sau
Dipesh Rana

5
@DipeshRana 'cái sau' áp dụng cho câu riêng của Timothy003, không phải câu hỏi.
Jayesh Bhoot

1
Cảm ơn đã đưa vấn đề này lên. Trong nhiều trường hợp, sự khác biệt về hiệu suất là không đáng kể, nhưng các tài liệu không thực sự đề cập đến việc hai phương pháp này được thực hiện khác nhau! Vì lợi ích của các thực tiễn tốt nhất, thật tốt khi biết rằng find()gần như luôn luôn nhanh hơn.
Steve Benner

Đó là lý do tại sao tôi không bao giờ thích cách xây dựng "cái trước" hay "cái sau" bằng tiếng Anh. Chỉ cần nói những gì bạn có ý nghĩa. Sheesh.
Chris Walker

Câu trả lời:


415

children()chỉ nhìn vào các phần tử con ngay lập tức của nút, trong khi di find()chuyển ngang qua toàn bộ DOM bên dưới nút, do đó children() sẽ nhanh hơn khi đưa ra các triển khai tương đương. Tuy nhiên, find()sử dụng các phương thức trình duyệt riêng, trong khi children()sử dụng JavaScript được diễn giải trong trình duyệt. Trong các thí nghiệm của tôi không có nhiều sự khác biệt về hiệu suất trong các trường hợp điển hình.

Việc sử dụng tùy thuộc vào việc bạn chỉ muốn xem xét con cháu ngay lập tức hay tất cả các nút bên dưới nút này trong DOM, nghĩa là chọn phương thức phù hợp dựa trên kết quả bạn mong muốn, chứ không phải tốc độ của phương pháp. Nếu hiệu suất thực sự là một vấn đề, thì hãy thử nghiệm để tìm giải pháp tốt nhất và sử dụng giải pháp đó (hoặc xem một số điểm chuẩn trong các câu trả lời khác tại đây).


9
Chắc chắn, nhưng điều gì xảy ra nếu phần tử cha chỉ có các nút con? Tôi sẽ làm một số hồ sơ về điều này.
jason

11
Hiệu suất của trẻ em và tìm kiếm phụ thuộc vào trình duyệt và mức độ phức tạp của việc tìm kiếm DOM của bạn. Trên các trình duyệt hiện đại, find () sử dụng bên trong querySelectorAll, có thể dễ dàng vượt trội hơn trẻ em () trong bộ chọn phức tạp và trên cây con DOM nhỏ đến trung bình.
LeJared

Sẽ giúp cung cấp một số kết quả định lượng của các thí nghiệm của bạn.
Lu-ca

Đối với tôi trong tất cả các bài kiểm tra với các phân cấp lồng nhau trong khoảng từ 5 đến 20 find () luôn vượt trội so với trẻ em (). (đã thử nghiệm trong Google Chrome 54) Tôi mong đợi điều ngược lại. Vì vậy, từ bây giờ, tôi sẽ thực hiện một cách dễ dàng và tìm (...) các yếu tố của mình thay vì truyền tải chúng qua trẻ em ().
Children

179

Thử nghiệm jsPerf này cho thấy find () nhanh hơn. Tôi đã tạo ra một bài kiểm tra kỹ lưỡng hơn và nó vẫn có vẻ như find () vượt trội hơn trẻ em ().

Cập nhật: Theo nhận xét của tvanfosson, tôi đã tạo một trường hợp thử nghiệm khác với 16 cấp độ lồng nhau. find () chỉ chậm hơn khi tìm tất cả các div có thể, nhưng find () vẫn vượt trội so với trẻ em () khi chọn cấp độ div đầu tiên.

trẻ em () bắt đầu vượt trội hơn find () khi có hơn 100 cấp độ lồng và khoảng hơn 4000 div để tìm () để vượt qua. Đó là một trường hợp thử nghiệm thô sơ, nhưng tôi vẫn nghĩ rằng find () nhanh hơn trẻ em () trong hầu hết các trường hợp.

Tôi đã xem qua mã jQuery trong Công cụ dành cho nhà phát triển Chrome và nhận thấy rằng trẻ em () bên trong thực hiện các cuộc gọi đến anh chị em (), bộ lọc () và trải qua một vài biểu thức chính hơn so với find ().

find () và children () đáp ứng các nhu cầu khác nhau, nhưng trong trường hợp find () và children () sẽ cho kết quả giống nhau, tôi khuyên bạn nên sử dụng find ().


4
Có vẻ như trẻ em sử dụng các phương pháp truyền tải dom và tìm thấy sử dụng api chọn, nhanh hơn.
topek

4
Trường hợp kiểm tra khá thoái hóa vì bạn chỉ có một cấp độ lồng. Nếu bạn muốn trường hợp chung, bạn sẽ phải thiết lập một số độ sâu lồng tùy ý và kiểm tra hiệu suất khi find () đi qua các cây sâu hơn trẻ em ().
tvanfosson

Nếu bạn đang kiểm tra xem một phần tử con số ít cụ thể (ví dụ: event.target) có trong một phần tử dom cụ thể không (ví dụ: $ ('. Navbar')) thì $ .contains (this, event.target) là nhanh nhất (8.433.609 / giây so với 140k cho tìm kiếm jquery nhanh nhất). jsperf.com/child-is-in-parent
Chris Sattinger

92

Đây là một liên kết có một bài kiểm tra hiệu suất bạn có thể chạy. find()thực sự nhanh hơn khoảng 2 lần children().

Chrome trên OSX10.7.6


$ .contains (document.getEuityById ('list'), $ ('. test') [0]) là 8.433.609 / giây. Nếu bạn có các yếu tố cụ thể và chỉ muốn biết B có ở A không thì điều này là tốt nhất. jsperf.com/child-is-in-parent
Chris Sattinger

Bài kiểm tra tốt Lưu ý rằng nó có thể nhanh hơn nữa nếu bạn làm một cái gì đó như var $test = $list.find('.test');trong đó danh sách $ là đối tượng jQuery. jsperf.com/jquery-selector-context/101
Maciej

24

Những người đó sẽ không nhất thiết cho cùng một kết quả: find()sẽ giúp bạn có được bất kỳ nút con cháu nào, trong khi đó children()sẽ chỉ giúp bạn có con ngay lập tức phù hợp.

Tại một thời điểm, find()đã chậm hơn rất nhiều vì nó phải tìm kiếm mọi nút con cháu có thể là một trận đấu, và không chỉ là những đứa trẻ ngay lập tức. Tuy nhiên, điều này không còn đúng nữa; find()nhanh hơn nhiều do sử dụng các phương pháp trình duyệt riêng.


1
Không theo các câu trả lời khác haha: p. Chỉ khi bạn có một cây DOM rất, rất, rất lớn ..
pgarciacamou

1
@Camou Câu trả lời này là bốn tuổi. find()đã chậm hơn nhiều vào thời điểm đó!
John Women'sella

@camou đang nói rằng phần trình diễn là "Không theo các câu trả lời khác". Đoạn đầu tiên của câu trả lời này là chính xác.
Don Cheadle

14

Không ai trong số các câu trả lời khác xử lý các trường hợp sử dụng .children()hoặc .find(">")để chỉ tìm kiếm cho trẻ em ngay lập tức của một yếu tố phụ huynh. Vì vậy, tôi đã tạo ra một bài kiểm tra jsPerf để tìm hiểu , sử dụng ba cách khác nhau để phân biệt trẻ em.

Khi điều đó xảy ra, ngay cả khi sử dụng bộ chọn ">" bổ sung, .find()vẫn nhanh hơn rất nhiều so với .children(); trên hệ thống của tôi, gấp 10 lần.

Vì vậy, từ quan điểm của tôi, dường như không có nhiều lý do để sử dụng cơ chế lọc của .children()tất cả.


3
Cảm ơn đã bình luận điều này! Tôi tự hỏi liệu jQuery có nên chuyển sang làm .children (x) thành bí danh cho .find (">" + x) hay không, mặc dù có thể có những biến chứng khác mà tôi không nghĩ tới.
Michael Scott Cuthbert

1
Đây dường như là sự so sánh thích hợp nhất. Cảm ơn!
GollyJer

3

Cả hai find()children()phương thức đều được sử dụng để lọc phần tử con của các phần tử phù hợp, ngoại trừ phần tử trước được di chuyển xuống bất kỳ cấp nào, phần sau sẽ di chuyển xuống một cấp.

Để đơn giản hóa:

  1. find() - tìm kiếm thông qua các yếu tố phù hợp 'con, cháu, chắt ... tất cả các cấp.
  2. children() - chỉ tìm kiếm thông qua con của các phần tử phù hợp (giảm một cấp).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.