我需要能够删除所有具有.remove类的DOM对象,只要所有后代都具有.remove或.removable类。忽略空格。如果可以删除文本节点,则它必须只包含空格(制表符,换行符,空格)。
.remove和.removable的html对象可以是任何类型的html实体,可以接收包含输入的类。如果后代是一个除了空格以外的任何文本节点,则无法删除上升空间。
具有.remove类的对象可以具有.remove或.removable的后代。
后代可以是远离相关节点的任何代数。
如果删除某个节点,则会删除所有子节点。
(在示例中,没有保证上面的节点是正文。)
示例:
版本1 :(应删除ex1)
<div id="div1" class="remove">
<input id="rad1" class="removable" type="radio" />
<img id="img1" src="img.gif" class="remove">
<div id="div2" class="removable">
</div>
</div>
版本2 :(不应删除ex1,因为div2包含的文本点头不仅仅是空格,但应删除img1)
<div id="div1" class="remove">
<input id="rad1" class="removable" type="radio" />
<img id="img1" src="img.gif" class="remove">
<div id="div2" class="removable">some text here
</div>
</div>
版本3 :(不应删除div1,因为img1不是.remove或.removeable)
<div id="div1" class="remove">
<input id="rad1" class="removable" type="radio" />
<img id="img1" src="img.gif">
<div id="div2" class="removable">
</div>
</div>
答案 0 :(得分:1)
这个应该有效:
$("body > div.remove").not(":has(:not(.remove))").filter(function() {
return $(this).text().trim().length == 0;
}).remove();
实际上,:has(:not(.remove))
选择器的点数转到Nick Craver,但他删除了答案,因为他忘记了filter()
。我等了5分钟,但由于没有更新,即使我发布了一个微妙的提示,我只是发布了一个。
答案 1 :(得分:0)
可能是这样的吗?
$('div.remove').each(function() {
var remove = true;
$(this).children().each(function () {
if (!$(this).is('.remove')) { remove = false; }
if ($(this).is('div')) {
if (!$(this).html().test(/^\s+$/) { remove = false; }
}
}
if (remove == true) { $(this).remove(); }
});