使用类.remove删除所有HTML对象,其子项(如果有)都具有class .remove或class .removable

时间:2010-06-30 17:00:59

标签: jquery

我需要能够删除所有具有.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>

2 个答案:

答案 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分钟,但由于没有更新,即使我发布了一个微妙的提示,我只是发布了一个。

Here's a live demo

答案 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(); }
});