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