J'ai une longue liste UL, j'ai besoin de casser dans des listes plus petites contenant environ 20 articles chacun.
Je pensais que je pourrais utiliser quelque chose comme p> mais ce n'est pas le cas. Aucune idée de l'utilisation de jQuery d'une manière qui utilise un processeur minimal? P> p>
10 Réponses :
rien de tout aussi simple (que je suis au moins au moins) malheureusement. Essayez ceci comme alternative:
$(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); }); }); });
Je créerais des fragments de document avec votre LI code> S, puis les reconstituer à l'emplacement que vous voulez. Dans ce cas, je les réapprouves au corps:
$(function(){
var $bigList = $('#bigList'), group;
while((group = $bigList.find('li:lt(20)').remove()).length){
$('<ul/>').append(group).appendTo('body');
}
});
Juste pour courir, j'ai essayé de faire cela avec regex à la place: Jsbin.com/acupof/2/edit # Javascript, en direct ... Je ne peux pas dire que c'est plus élégant. :)
Pour une vitesse pure, la solution de regex pourrait être meilleure. Si vous avez changé ma réponse à utiliser détacher code> au lieu de
supprimer code> il conserverait des événements qui ont été attachés aux éléments ou aux sous-éléments. Ce serait utile dans certaines situations. Bien que avec de longues listes, vous devriez probablement déléguer de toute façon déléguer. <3Z
Qu'est-ce que le groupe est défini, avant qu'il ne soit utilisé dans la boucle tandis que?
Voici un exemple de travail, changez simplement le MOD 5 au 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>
Voici une autre option - je n'ai profilé aucun de ce qui précède, alors allez avec tout ce qui est le plus rapide. Il suppose que l'UL en question a l'identifiant de #list.
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());
Vous pouvez essayer quelque chose comme ceci:
$("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); } } }
Fonction: utilisation: p> ou: p> $('div#slides').splitUp(3,'<div/>')
Si vous le faites récursif, il est encore plus court
Celui-ci divise le menu en morceaux d'environ une longueur égale Fonction SplitMenu (menu_id, pièces) {
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);
Une autre version en tant que plug-in jquery:
J'avais besoin de la fonctionnalité où je devrais Ajoutez un élément entre la liste que j'ai divisée. Qui a été ajouté en tant que paramètre facultatif. P> Un exemple est disponible à http: // jsfiddle .NET / ROEBURG / 5F2HW / P> L'utilisation de la fonction est comme: p> La fonction est définie comme suit: < / p> espérons que cela aide. p> p>
Il y a une bibliothèque qui fait ça - github.com/yaireo/listbreaker