#jquery #size #each #children #addclass
#jquery #размер #каждый #дочерние элементы #addclass
Вопрос:
Я хочу добавить класс «что угодно» к каждому элементу, у которого более 2 дочерних элементов. К сожалению, мой код не работает, я думаю, мне нужно определить (это) и, возможно, использовать каждый, но я не уверен, как это сделать.
Вот мой код:
if ( jQuery('#container .document').children().size() > 2 ) {
jQuery(this).addClass("anything");
}
Неработающий пример:
Комментарии:
1. Несколько второстепенных вещей: (1)
$( '.document', '#container' )
более эффективен. (2) Вам не нужно использоватьjQuery
вместо$
, если ваш код jQuery находится внутри готового обработчика (где он должен быть в любом случае), поскольку вы можете передать$
имя в этот обработчик:jQuery(function ($) { ... your code ... });
Ответ №1:
Вы можете использовать фильтр, чтобы ограничить список элементами с более чем двумя дочерними элементами.
jQuery('#container .document').filter(function() {
return this.children.length > 2; //Use just the regular DOM children property in here
}).addClass("anything");
JSFiddle: http://jsfiddle.net/HHSuM/4 /
Комментарии:
1. Спасибо за предупреждение
childElementCount
.:)
Ответ №2:
Перебирайте элементы с помощью .each()
:
$('#container .document').each(function() {
if (this.children.length > 2) {
$(this).addClass('anything');
}
});
Комментарии:
1. Вы также можете протестировать
($(this).children(:gt(1)).length)
, но я подозреваю, что использование>
вместо:gt
быстрее.2. Спасибо, у меня есть дополнительный вопрос: если у меня на странице около 50 элементов .document и у них около 50-100 дочерних элементов — сильно ли этот код замедлит работу моего сайта?
3. Нет. Вы будете перебирать только 50
.document
секунд и считать дочерние элементы, что не должно занимать намного больше доли секунды. Вы уже пробовали запускать код?4. @Blender должен быть
children()
(с скобками). Либо$(this).children().length
илиthis.children.length
.5. @Blender, да, это работает как шарм, по крайней мере, на локальном хосте. Большое вам спасибо! 🙂
Ответ №3:
Я подумал, что это было интересно, и попытался использовать :has()
в сочетании с :nth-child()
, но я получаю синтаксическую ошибку.
// Does NOT work... why?
jQuery('#container .document:has(*:nth-child(3))').addClass('anything');
Но, слегка изменив подход, работает:
// Nifty!
jQuery('#container .document *:nth-child(3)').parents('.document').addClass('anything');
По сути, мы ищем элементы с 3-м элементом, а затем перемещаемся вверх по DOM.
Комментарии:
1. должен отдать вам должное, это действительно отличный селектор, хотя для простоты я бы все равно использовал
.filter()
, конечно, отличная находка
Ответ №4:
Используется .each()
для перебора #container .document
элементов.
Обновлен ваш jsfiddle. Кажется, работает!
Ответ №5:
здесь у вас есть много вариантов
-
вы можете использовать .each() для перебора элементов, проверьте в функции обратного вызова, есть ли у них 2 дочерних элемента или более, а затем добавьте класс
-
другой вариант, который мне нравится больше, — это использование .filter() вот так:
$('#container .document').filter(function(){ return $(this).children().length > 2; }).addClass('anything');
или ваш пример: http://jsfiddle.net/saelfaer/HHSuM/6 /