Подсчитать непосредственные дочерние элементы div, используя jQuery


180

У меня есть следующая структура узла HTML:

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

Как мне подсчитать количество непосредственных детей fooтого типа div? В приведенном выше примере результат должен быть два ( barи baz).


1
Я добавил тест jsperf, чтобы увидеть разницу в скорости между разными подходами. см. мой ответ ниже
manikanta

Ответы:


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

Направьте потомков элемента с идентификатором 'foo', который является div. Затем извлекается размер упакованного набора.


1
В пятницу мне было просто интересно, как считать столбцы таблицы с помощью jQuery. Я должен попробовать аналогичный подход $('#table > th').size().
Джим Шуберт

1
Иногда это не работает, и вы должны использовать $ ('# foo'). Children (). Size (), который в любом случае быстрее согласно @mrCoder
472084

Если я хочу использовать это вместо #foo тогда. Как использовать это?
Мукеш,

@ 472084 Если вы сделаете это таким образом, он также будет учитывать элемент span. Обратите внимание, как вопрос указывает, что он хочет считать только элементы "div", а не все элементы.
Анхель Бланко

68

Я рекомендую использовать $('#foo').children().size()для лучшей производительности.

Я создал тест jsperf, чтобы увидеть разницу в скорости, и children()метод превзошел подход дочернего селектора (#foo> div) как минимум на 60% в Chrome (сборка сборок v15), на 20-30% в Firefox (v4).

Кстати, само собой разумеется, что эти два подхода дают одинаковые результаты (в данном случае 1000).

[Обновить] Я обновил тест, включив тест size () и длины, и они не имеют большого значения (результат: lengthиспользование немного быстрее (2%), чем size())

[Update] Из - за неправильной разметки видели в OP (до «Разметка ПРОВЕРЯЕМЫЕ» обновление мной), так $("#foo > div").lengthи в $('#foo').children().lengthрезультате один и тот же ( jsfiddle ). Но для правильного ответа, чтобы получить ТОЛЬКО 'div' детей, СЛЕДУЕТ использовать селектор детей для правильной и лучшей производительности


хотя этот вопрос задан некоторое время назад, просто хотел поделиться, чтобы это могло помочь кому-то отныне
manikanta

Где там фильтруются только "div" дети?
Андрей Церкус

2
.lengthна самом деле является предпочтительным методом, потому что он не имеет накладных расходов при вызове функции.
Ник Эйч

Да, дочерний селектор правильный, потому что он использует собственные селекторы CSS, поэтому выбор написан на C ++, а не на JavaScript ... Разница в производительности. Этот ответ легче понять, но намного медленнее.
mdenton8

@manikanta Эй, очень подробный ответ. Извините, что беспокою, один вопрос. Если мне нравится $('#extraLinks').children().size()считать текстовые поля в div (называемом extraLinks), почему я получаю, 4когда их всего 2. В общем, я получаю длину, умноженную на 2 ... Любая идея, почему? Спасибо
Слевин

25
$("#foo > div") 

выбирает все div, которые являются прямыми потомками #foo,
когда у вас есть набор дочерних элементов, вы можете использовать функцию size:

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

или вы можете использовать

$("#foo > div").length

Оба вернут вам одинаковый результат



8

В ответ на mrCoders ответ с помощью jsperf, почему бы просто не использовать узел dom?

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

Вы можете попробовать этот тест здесь: http://jsperf.com/jquery-child-ele-size/7

Этот метод получает 46 095 оп / с, в то время как другие методы в лучшем случае 2000 оп / с


2
ОП попросил только дочерние элементы div
dj18


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

В jQuery есть функция .size (), которая будет возвращать количество раз, которое элемент появляется, но, как указано в документации по jQuery, он медленнее и возвращает то же значение, что и свойство .length, поэтому лучше просто использовать. свойство длины. Отсюда: http://www.electrictoolbox.com/get-total-number-matched-elements-jquery/


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>


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

или

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

Как уже было сказано, оба возвращают один и тот же результат.
Но функция size () - это скорее jQuery «ПК».
У меня была похожая проблема с моей страницей.
А пока просто опустите> и все должно работать нормально.


Селектор Descendant возвращает всех потомков #superpics, включая ребенка, внука, правнука и т. Д.
Этого

подробнее jQuery "ПК". средства ?
Ганшьям Лакхани


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.