Порахуйте безпосередні дочірні елементи 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', який є дівами. Потім отримайте розмір виробленого загорнутого набору.


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 (canary build v15) 20-30% у Firefox (v4).

До речі, що ці два підходи дають однакові результати (у даному випадку 1000).

[Оновити] Я оновив тест, щоб включити тест size () vs length, і вони не мають великої різниці (результат: lengthвикористання трохи швидше (2%), ніж size())

[Оновлення] Через неправильну розмітку, помічену в ОП (до мого оновлення "перевірена розмітка"), обидві $("#foo > div").length& отримали$('#foo').children().length однакове ( jsfiddle ). Але для правильної відповіді, щоб отримати ТОЛЬКІ «діві» дітей, ОДИН ДОБРІ використовувати добірчик для правильної та кращої роботи


хоча це питання задається колись назад, просто хотів поділитися, щоб це могло допомогти комусь із цього моменту
manikanta

Де там фільтрують лише «дівочих» дітей?
Андрій Церкус

2
.lengthнасправді є кращим методом, оскільки він не має накладних витрат виклику функції.
Nic Aitch

Так, дочірній селектор правильний, оскільки він використовує нативні селектори CSS, тому вибір записується на C ++, а не на JavaScript ... Досить різниця у продуктивності. Цю відповідь легше зрозуміти, але набагато повільніше.
mdenton8

@manikanta Гей, дуже детальний ансер. Вибачте, що турбуєте, одне питання. Якщо мені подобається $('#extraLinks').children().size()рахувати текстові поля в розділі (з назвою extraLinks), чому я отримую, 4коли їх всього 2. Загалом, я отримую довжину, помножену на 2 ... Будь-яка ідея, чому? Дякую
slevin

25
$("#foo > div") 

вибирає всі диви, які є безпосередніми нащадками #foo,
коли у вас є набір дітей, ви можете використовувати функцію розміру:

$("#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 op / s, тоді як інші методи в кращому випадку 2000 op / s


2
ОП попросили лише дочірні елементи дитини
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 "ПК".
У мене була схожа проблема зі своєю сторінкою.
Поки що, просто опустіть>, і це повинно працювати добре.


Набір нащадків поверне всіх нащадків #superpics, включаючи дитину, онука, правнука тощо, з цього елемента, а не лише безпосередніх дітей
manikanta

більше jQuery "ПК". засоби ?
Ghanshyam Lakhani


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.