2012-11-14 42 views
1

我有一个ul列表。在那里,有一些li s。我想删除所有li不要有孩子noremove删除所有没有特定类别的li

这里是我的HTML:脚本运行

<ul> 
    <li>Item 1</li> 
    <li>Item 2 
     <ul> 
      <li>Item 2.1</li> 
      <li>Item 2.2</li> 
      <li>Item 2.3</li> 
     </ul> 
    </li> 
    <li>Item 3 
     <ul> 
      <li class="noremove">Item 3.1</li> 
      <li>Item 3.2</li> 
     </ul> 
    </li> 
    <li class="noremove">Item 4 
     <ul> 
      <li>Item 4.1</li> 
      <li>Item 4.2</li> 
     </ul> 
    </li> 
    <li>Item 5 
     <ul> 
      <li>Item 5.1 
       <ul> 
        <li class="noremove">Item 5.1.1</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

后,我希望它看起来像这样:

<ul> 
    <li>Item 3 
     <ul> 
      <li class="noremove">Item 3.1</li> 
     </ul> 
    </li> 
    <li class="noremove">Item 4</li> 
    <li>Item 5 
     <ul> 
      <li>Item 5.1 
       <ul> 
        <li class="noremove">Item 5.1.1</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

正如你可以看到,第3项不会被删除,因为它有一个class="noremove"的子节点。然而,第3.2项被删除,因为它没有class="noremove"也没有任何班级的孩子。

我该如何制作一个脚本来做到这一点?它需要在列表上递归运行,我想不出如何做到这一点?

回答

8

你想找到这并不有noremove类的所有立,看看他们是否有一个孩子带班noremove:

$("ul li:not(.noremove)").filter(function(){ 
    return $(this).find(".noremove").length === 0; 
}).remove(); 

演示:http://jsfiddle.net/kNvyF/

+0

这很好!谢谢! – Elias

+0

是否可以调整代码,因此它不会删除.noremove的子项?因此,项目4.1和项目4.2不会被删除(我知道他们在我的例子中,但改变了我的想法)。 – Elias

+0

没有真正测试过,但像这样:http://jsfiddle.net/kNvyF/3/应该做到这一点。 – voigtan

0
$('li').not('.noremove').remove() 
+0

不工作。它不会递归检查,所以只有li会留下项目4,因为它是'noremove'唯一的父节点。 如果您已经测试过,并将其与我想要的输出进行比较,您可能已经看到了这一点。 – Elias

+0

这将删除所有列表项,保存三个有类的项目,并且OP要维护该类项目的父项。 –

相关问题