Подсчитать непосредственные дочерние элементы 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
источник
хотя этот вопрос задан некоторое время назад, просто хотел поделиться, чтобы это могло помочь кому-то отныне
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

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

Darko Z
источник
17
$('#foo').children('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 оп / с

HaxElit
источник
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>
Джон Альварес
источник
3

С самой последней версией jquery вы можете использовать $("#superpics div").children().length.

Кент Томас
источник
2
var n_numTabs = $("#superpics div").size();

или

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

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

Эндрю Перкинс
источник
Селектор Descendant возвращает всех потомков #superpics, включая ребенка, внука, правнука и т. Д.
Этого
подробнее jQuery "ПК". средства ?
Ганшьям Лакхани
1
$("div", "#superpics").size();
Александрос Иоанну
источник
1
Это считает всех div потомков, а не только детей.
Феликс Клинг
-1

Попробуйте это для непосредственных дочерних элементов типа div

$("#foo > div")[0].children.length
талант маханья
источник