将嵌套列表拆分为单独的列表

4
我有一个用于导航的嵌套列表。如何使用Jquery将嵌套列表拆分为多个列表,每个嵌套列表都分开,但仍保持与原始标题在一起的分离列表?
HTML代码:
<ul id="bigList">
  <li><a href="#">Diary products</a>
    <ul>
      <li><a href="#">Milk</a>
        <ul>
          <li><a href="#">Goat</a></li>
          <li><a href="#">Cow</a>
            <ul>
              <li><a href="#">Smelly</a></li>
              <li><a href="#">Extra smelly</a></li>
            </ul>
            <li><a href="#">Soya</a></li>
          </li>
        </ul>
      </li>
      <li><a href="#">Eggs</a></li>
      <li><a href="#">Cheese</a></li>
      <li><a href="#">Pasta</a></li>
    </ul>
  </li>
</ul>

期望输出:
  <ul>
   <li><a href="#">Diary Products</a>
    <ul>
      <li><a href="#">Milk</a></li>
      <li><a href="#">Eggs</a></li>
      <li><a href="#">Cheese</a></li>
      <li><a href="#">Pasta</a></li>
     </ul>
   </li>
  </ul>

  <ul>
    <li><a href="#">Milk</a>
      <ul>
        <li><a href="#">Goat</a></li>
        <li><a href="#">Cow</a></li>
        <li><a href="#">Soya</a></li>     
      </ul>
    </li>
   </ul>

    <ul>
      <li><a href="#">Cow</a>
        <ul>
          <li><a href="#">Smelly</a></li>
          <li><a href="#">Extra smelly</a></li>
        </ul>
      </li>
    </ul>

到目前为止的Javascript代码:
$(function () {
    var $bigList = $('#bigList'),
        group;
    while ((group = $bigList.find('li:lt(20)').remove()).length) {
        $('<ul/>').append(group).appendTo('body');
    }
});

这是一个小提琴(Fiddle)。 http://jsfiddle.net/zEA5t/3/

2
我忍不住感觉这里有些过于复杂了。 - Bill Criswell
第一个问题:为什么生成的HTML(我假设)像第一个例子一样?我感觉应该改变HTML渲染方式,而不是通过jQuery进行二次适配。除非你有什么没有告诉我们的 :) - Flater
是的,你说得对,HTML应该改变,但由于我们的CMS限制,我无法进行修改。真是令人烦恼! - gamma911
2个回答

6
这段简单的代码可以实现它:
var myList = $('<ul>');

var $originalList = $('#bigList');

$originalList.find('li:has(li)').each(function(){
    var $this = $(this);

    $this.clone().appendTo(myList).find('>ul >li >ul').remove();
})

$('body').append(myList);

Fiddle : http://jsfiddle.net/zEA5t/6/


看起来工作得非常完美!但是有一个问题-原始列表仍然在HTML中,如何去除它? - gamma911
$originalList.remove()。如果你想给新列表一个id:myList.prop('id', 'bigList') - Karl-André Gagnon

0
我正在使用选择器ul > li > ul,在输出结果中。
$(function(){
    $('ul > li > ul').each(function(i){
        var clone = $(this).clone();
        clone.find('ul').remove();

        var clone2 = $(this).parent().clone();
        clone2.children('ul, li').remove();
        clone2.append(clone);

        var clone3 = $(this).parent().parent().clone();
        clone3.children('ul, li').remove();
        clone3.append(clone2);

        clone3.appendTo('#output');
    });
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接