Đếm các phần tử div con ngay lập tức bằng cách sử dụng jQuery


180

Tôi có cấu trúc nút HTML sau:

<div id="foo">
  <div id="bar"></div>
  <div id="baz">
    <div id="biz"></div>
  </div>
  <span></span>
</div>

Làm thế nào để tôi đếm số lượng trẻ em ngay lập tức foo, đó là loại div? Trong ví dụ trên, kết quả phải là hai ( barbaz).


1
Tôi đã thêm một bài kiểm tra jsperf để xem sự khác biệt về tốc độ giữa các cách tiếp cận khác nhau. xem câu trả lời của tôi dưới đây
manikanta

Câu trả lời:


345
$("#foo > div").length

Con trực tiếp của phần tử với id 'foo' là div. Sau đó lấy kích thước của bộ bọc được sản xuất.


1
Tôi chỉ tự hỏi vào thứ Sáu về cách đếm các cột trong bảng với jQuery. Tôi sẽ phải thử một cách tiếp cận tương tự : $('#table > th').size().
Jim Schubert

1
Đôi khi điều này không hoạt động và bạn phải sử dụng $ ('# foo'). Children (). Size () nhanh hơn theo @mrCoder
472084

Nếu tôi muốn sử dụng cái này thay vì #foo thì làm thế nào để sử dụng cái này?
Mukesh

@ 472084 Nếu bạn làm theo cách đó, nó cũng sẽ tính cả phần tử "span". Lưu ý cách câu hỏi chỉ định anh ta chỉ muốn tính các phần tử "div", không phải tất cả các phần tử.
Angel Blanco

68

Tôi khuyên bạn nên sử dụng $('#foo').children().size() để có hiệu suất tốt hơn.

Tôi đã tạo một thử nghiệm jsperf để xem sự khác biệt về tốc độ và children()phương pháp đánh bại cách tiếp cận bộ chọn con (#foo> div) ít nhất 60% trong Chrome (canary build v15) 20-30% trong Firefox (v4).

Nhân tiện, không cần phải nói, hai cách tiếp cận này tạo ra kết quả giống nhau (trong trường hợp này là 1000).

[Cập nhật] Tôi đã cập nhật thử nghiệm để bao gồm kích thước () so với thử nghiệm độ dài và chúng không tạo ra nhiều khác biệt (kết quả: lengthviệc sử dụng nhanh hơn một chút (2%) so với size())

[Cập nhật] Do đánh dấu không chính xác được thấy trong OP (trước khi tôi cập nhật 'đánh dấu xác thực'), cả hai $("#foo > div").length& đều cho $('#foo').children().lengthkết quả giống nhau ( jsfiddle ). Nhưng để có câu trả lời đúng để chỉ có con 'div', người ta NÊN sử dụng bộ chọn con để có hiệu suất chính xác & tốt hơn


mặc dù câu hỏi này đôi khi được hỏi lại, chỉ muốn chia sẻ để điều này có thể giúp đỡ ai đó từ bây giờ
manikanta

Ở đâu chỉ lọc trẻ em 'div' ở đó?
Andrey Tserkus

2
.lengththực tế là phương thức ưa thích vì nó không có chi phí hoạt động của lệnh gọi.
Nic Aitch

Đúng, bộ chọn con là chính xác vì nó sử dụng bộ chọn CSS nguyên gốc, vì vậy lựa chọn được viết bằng C ++ thay vì JavaScript ... Khá khác biệt về hiệu suất. Câu trả lời này dễ hiểu hơn nhưng chậm hơn rất nhiều.
mdenton8

@manikanta Này, anser rất chi tiết. Xin lỗi đã làm phiền, một câu hỏi. Nếu tôi thích $('#extraLinks').children().size()đếm các hộp văn bản trong một div (được đặt tên là ExtraLinks) thì tại sao tôi chỉ nhận được 4khi chúng chỉ có 2. Nói chung, tôi nhận được độ dài nhân với 2 ... Bạn có biết tại sao không? Cảm ơn
slevin

25
$("#foo > div") 

chọn tất cả các div là hậu duệ ngay lập tức của #foo
khi bạn có tập hợp con bạn có thể sử dụng hàm kích thước:

$("#foo > div").size()

hoặc bạn có thể sử dụng

$("#foo > div").length

Cả hai sẽ trả lại cho bạn cùng một kết quả



8

Đáp lại câu trả lời của mrCoders bằng jsperf tại sao không sử dụng nút dom?

var $foo = $('#foo');
var count = $foo[0].childElementCount

Bạn có thể thử bài kiểm tra tại đây: http://jsperf.com/jquery-child-ele-size/7

Phương pháp này nhận được 46.095 op / s trong khi các phương thức khác tốt nhất là 2000 op / s


2
OP chỉ yêu cầu các phần tử div con
dj18



5
var divss = 0;
$(function(){
   $("#foo div").each(function(){
    divss++;

   });
   console.log(divss);  
});     
<div id="foo">
  <div id="bar" class="1"></div>
  <div id="baz" class="1"></div>
  <div id="bam" class="1"></div>
</div>

3

Với phiên bản mới nhất của jquery, bạn có thể sử dụng $("#superpics div").children().length.


2
var n_numTabs = $("#superpics div").size();

hoặc là

var n_numTabs = $("#superpics div").length;

Như đã nói, cả hai đều trả lại kết quả như nhau.
Nhưng hàm size () là jQuery "PC" hơn.
Tôi đã có một vấn đề tương tự với trang của tôi.
Bây giờ, chỉ cần bỏ qua> và nó sẽ hoạt động tốt.


Hậu duệ chọn sẽ trả lại tất cả hậu duệ của #superpics, bao gồm cả con, cháu, chắt, v.v., về yếu tố đó, không chỉ là những đứa trẻ ngay lập tức
manikanta

thêm "PC" jQuery. có nghĩa ?
Ghanshyam Lakhani


-1

Hãy thử điều này cho các phần tử con ngay lập tức của loại div

$("#foo > div")[0].children.length
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.