隐藏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();