Вариантов много, все зависит от ваших предпочтений.
Чем более компактный ответ, тем менее читаемым он становится, это важно для скорости, и насколько эффективной должна быть пустая функция, элемент, не содержащий узлов, не совпадает с элементом :empty
.
Самый компактный / медленный / очень эффективный / читаемый / универсальный селектор
$('.section:empty').hide();
Очень компактный / немного быстрее (все еще медленный) / Очень эффективный / читаемый / менее универсальный селектор
$('div.section:empty').hide();
Компактный / Быстрый / Очень эффективный / читаемый / специальный селектор
$("#bar").find('div.section:empty').hide();
Я собираюсь придерживаться более специфичного селектора, поскольку он быстрее.
Менее компактный / еще быстрее / очень эффективный / еще менее читаемый
$("#bar").find('div.section').filter(function(i,elem) {
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
if ( elem.nodeType < 6 ) {
return false;
}
}
return true;
}).hide();
Еще менее компактно / Еще быстрее Все еще / Очень эффективно / еще менее читабельно
$("#bar").find('div.section').each(function(i,elem){
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
if ( elem.nodeType < 6 ) {
return;
}
}
$(this).hide();
})
Компактный / намного быстрее / менее эффективный / менее читаемый
// Faster Still but less precise
$("#bar").find('div.section').filter(function() {
return !this.firstChild;
}).hide();
Меньше Компактный / Гораздо быстрее Еще / Меньше Эффективного / Меньше читаемого
$("#bar").find('div.section').each(function(){
if(!this.firstChild){
$(this).hide();
}
})
Эффективное решение
Более эффективные решения используют тот же подход, что и «пустой» фильтр jquery , он пытается воспроизвести функциональность псевдокласса CSS3 :empty
с учетом nodeType.
Например, если дочерний элемент имеет nodeType == COMMENT_NODE
(<!-- -->
), тогда родитель будет по-прежнему рассматриваться как пустой.
Все эти подходы можно улучшить, заменив .hide()
на .addClass('hide')
и добавив класс .hide
в свой CSS.
<style>
.hide {
display:none;
}
</style>
но если это звучит как подходящее для вас решение, то @ elliot-wood's CSS3 Answer , вероятно, лучше подойдет.
Мои личные предпочтения
$("#bar").find('div.section').filter(function() {
return !this.firstChild;
}).hide();
Несмотря на то, что этот подход не проверяет nodeType и использует метод .filter()
, а не более быстрый .each()
. Это просто более компактное и удобочитаемое решение.