有很多选择,这取决于您的偏好。答案越紧凑,可读性就越差。速度是否重要以及空函数应该多有效,一个不包含节点的元素与一个: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();
})
更紧凑/更快速/效果较弱/可读性较差
$("#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 == COMMENT_NODE
(<!-- -->
),那么父元素仍将被视为空。
通过用.addClass('hide')
替换.hide()
并在CSS中添加.hide
类,可以改进所有这些方法。
<style>
.hide {
display:none;
}
</style>
但如果这听起来对你来说是一个合适的解决方案,那么@elliot-wood 的CSS3答案可能更加适合。
我的个人偏好
$("#bar").find('div.section').filter(function() {
return !this.firstChild;
}).hide();
尽管这种方法没有检查节点类型,并且使用了.filter()
方法而不是更快的.each()
。但这只是一种更紧凑、可读性更强的解决方案。