2012-11-14 38 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要維護該類項目的父項。 –

相關問題