隐藏div,如果它们是空的

我有一些div可能是空的(取决于服务器端逻辑)。

如果他们在div中没有​​任何html(带有类部分),我只想隐藏它们。

我怎样才能做到这一点?

jQuery有一个:empty选择器。 所以,你可以简单地做:

 $('div.section:empty').hide(); 

这是一个CSS3解决方案,适合任何有兴趣的人

 div:empty { display:none; } 

为什么没有人使用.filter

 $("div.section").filter(function() { return this.childNodes.length === 0; }).hide(); 

与使用.each相比,这是一个更优雅的解决方案。

如果div包含空格或换行符,则此代码可能会有帮助…

 $(document).ready(function() { str = $('div.section').text(); if($.trim(str) === "") { $('div.section').hide(); } }); 

有很多选择,这取决于您的偏好。 答案越紧凑,它的可读性就越低,速度很重要,空函数的效果如何,不包含节点的元素与: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(); } }) 

有效解决方案

更有效的解决方案使用“空” jqueryfilter使用的相同方法,它尝试通过考虑nodeType来复制CSS3 :empty伪类的function。 例如,如果子元素具有nodeType == COMMENT_NODE ),那么父元素仍将被视为空。

所有这些方法都可以通过用.addClass('hide')替换.addClass('hide')并在CSS中添加.hide类来改进。

  

但如果这听起来像是一个合适的解决方案,那么@ elliot-wood的CSS3答案可能更适合。

我个人的偏好

 $("#bar").find('div.section').filter(function() { return !this.firstChild; }).hide(); 

即使这种方法不检查nodeType,它使用.filter()方法而不是更快的.each() 。 它只是一个更紧凑和可读的解决方案。

 $('div').each(function() { if($(this).html().size() == 0) $(this).remove(); }); 

如果你想稍后在同一页面中使用div,最好使用$(this).hide(); 而不是$(this).remove(); 因为如果使用remove(),将删除div;

你有权访问服务器逻辑吗?

另外客户端你可以这样做:

 $(function() { $('div').each(function() { if ($(this).html()=="") { $(this).hide(); } }); }); 

替换display:block; by display: none;

编辑:哦,我看到你想使用jQuery,然后使用.hide(): http : //api.jquery.com/hide/

 $('div.section:empty').css("display", "none"); 

我使用了过滤答案,但是当没有可见内容时,this.childNodes.length仍然保持返回1,因此最终将filter与trim结合起来。

 $("div").filter(function() { return j(this).text().trim() === ""; }).hide();