Подсчитать непосредственные дочерние элементы 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.