jQuery将较长的ul列表分割成较小的列表

我有一个很长的UL列表,我需要把它们分成两大小小的列表,每列大约有20个项目。

我在想我可以使用类似的东西

$(function() { $("ul li:nth-child(20n)").after("</ul><ul>"); }); 

但事实并非如此。 任何想法如何使用jQuery的方式,使用最小的CPU?

我会创build文件碎片与您删除li ,然后重新安装到您想要他们的位置。 在这种情况下,我把它们重新join了身体:

 $(function(){ var $bigList = $('#bigList'), group; while((group = $bigList.find('li:lt(20)').remove()).length){ $('<ul/>').append(group).appendTo('body'); } }); 

现场演示在: http : //jsbin.com/ejigu/33

没有那么简单(至less我知道),不幸的是。 试试这个作为替代:

 $(function() { $("ul").each(function() { var list = $(this); var size = 3; var current_size = 0; list.children().each(function() { console.log(current_size + ": " + $(this).text()); if (++current_size > size) { var new_list = $("<ul></ul>").insertAfter(list); list = new_list; current_size = 1; } list.append(this); }); }); }); 

你毫无疑问可以把它变成一个以块大小为参数的函数,但是我把它作为读者的一个练习。

这里有一个工作的例子,只需将mod 5改为mod 20。

 <html> <script type="text/javascript" src="jquery-1.3.2.js"></script> <script type="text/javascript"> function onLoad(){ var itemindex = 0; var Jlistobj = null; $('#list li').each(function() { if (itemindex % 5 == 0) { Jlistobj = $("<ul></ul>"); } Jlistobj.append($(this)); $('#out_div').append(Jlistobj); itemindex++; }); } </script> <body onLoad="onLoad()"> <ul id="list"> <li>item1</li> <li>item2</li> <li>item3</li> <li>item4</li> <li>item5</li> <li>item6</li> <li>item7</li> <li>item8</li> <li>item9</li> <li>item10</li> <li>item11</li> <li>item12</li> <li>item13</li> <li>item14</li> <li>item15</li> <li>item16</li> <li>item17</li> <li>item18</li> <li>item19</li> <li>item20</li> </ul> <div id="out_div"></div> </body> </html> 

function:

 $.fn.splitUp=function(splitBy,wrapper) { $all= $(this).find('>*'); var fragment=Math.ceil($all.length/splitBy); for(i=0; i< fragment; i++) $all.slice(splitBy*i,splitBy*(i+1)).wrapAll(wrapper); return $(this); } 

用法:

 $('ul#slides').splitUp(4,'&lt;li class=splitUp&gt;&lt;ul&gt;') 

要么:

 $('div#slides').splitUp(3,'&lt;div/&gt;') 

这个菜单分割成大约等长的函数splitMenu(menu_id,pieces){

  var $menu = $(menu_id), group; var splitItem = 0, totItemLen = 0, cumlen = 0; $($menu).find('li').each(function(){ totItemLen = totItemLen + $(this).width(); }); $($menu).find('li').each(function(i){ cumlen = cumlen + $(this).width(); if ( totItemLen/pieces < cumlen && splitItem == 0) splitItem = i; }); while((group = $($menu).find('li:lt(' + splitItem + ')').remove()).length){ $('<ul/>').attr('class',$($menu).attr('class')).append(group).appendTo($($menu).parent()); } $($menu).remove(); } splitMenu('#menu-footermenu', 2); 

只是作为一个jQuery插件的另一个版本:

 jQuery.fn.splitList = function(num) { var sublist; while((sublist = this.find('li:gt('+(num-1)+')').remove()).length){ this.after($('<ul/>').append(sublist)); } }; 

这是另一个select – 我没有描述上述任何一个,所以当然要用最快的方法。 它假定有问题的ul有#list的id。

  var listItemsPerList = 10; var listItems = $("ul > li").length; for (var i = 0; i < Math.round(listItems / listItemsPerList); i++) { var startingItem = i * listItemsPerList; var endingItem = (i + 1) * listItemsPerList; if (endingItem > listItems) { endingItem = listItems }; $("ul > li").slice(startingItem, endingItem).wrapAll("<ul></ul>"); } $("ul#list").replaceWith($("ul#list").children()); 

你可以尝试这样的事情:

 $("ul").each(function(k,v)){ split_list(v); } function split_list(list){ var li_num = $(list).find("li").length; if(li_num > 20){ var new_list = $("<ul></ul>"); $(list).after(new_list); new_list.append($(list).find("li:gt(20)")); if(new_list.find("li").length > 20){ split_list(new_list); } } } 

LE:我认为可以通过查找前面多less个新列表来创build列表并将〜20列的块移动到新创build的列表中,以便它们仅被移动一次。

这是jQuery原型($ .fn)对象的扩展,提供了一个可以链接到jQuery()函数的新方法。

我需要function,我需要在我分裂的列表之间添加一个元素。 这已被添加为可选参数。

一个例子可以在http://jsfiddle.net/roeburg/5F2hW/获得;

该函数的用法如下所示:

  $("ul").customSplitList(5); 

该function定义如下:

 // Function definition (function ($) { // Function is defined here ... $.fn.customSplitList = function (indexToSplit, elementToAddInBetween) { // Holds a reference to the element(list) var that = this; var subList, newList, listLength; // Only continue if the element is a derivitive of a list if ($(that) && ($(that).is("ul") || $(that).is("ol"))) { // Additionally check if the length & the split index is valid listLength = $(that).children().length; if ($.isNumeric(indexToSplit) && indexToSplit > 0 && indexToSplit < listLength) { // Based on list type, create a new empty list newList = $($(that).clone(true)).empty(); while ((subList = this.find('li:gt(' + (indexToSplit - 1) + ')').remove()).length) { newList.append(subList); } if (elementToAddInBetween && $(elementToAddInBetween)) { that.after(newList); newList.before(elementToAddInBetween); } else { that.after(newList); } } } }; })(jQuery); 

希望这可以帮助。

像这样的东西:

 var lis = $("ul > li"); for(var i = 0; i < lis.length; i+=20) { lis.slice(i, i+20).wrapAll("<ul></li>"); } $("ul > ul").unwrap(); 

工作演示