2009-09-16 7 views
4

Possible en double:
Wrap every 3 divs in a divComment emballer tous les 3 divs enfants avec html en utilisant jquery?

La première chose, je sais que je devrais utiliser un langage côté serveur pour ce faire non côté client comme jquery, mais ce n'est pas le point, je suis juste essayer d'apprendre à l'utiliser pour manipuler html. Heres le code html:

<div class="items"> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="1.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 1</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="2.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 2</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="3.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 3</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="4.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 4</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="5.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 5</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="6.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 6</span></div></div> 
</div> 

Je veux être en mesure de conclure tous les 3 <divs> dans le <div class="items"> avec une autre div: <div class="row"></div>. Donc, il se termine comme ceci:

<div class="items"> 
<div class="row"> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="1.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 1</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="2.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 2</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="3.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 3</span></div></div> 
</div> 
<div class="row"> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="4.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 4</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="5.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 5</span></div></div> 
    <div class="boxgrid"><span class="cushycms"><a href="#"><img src="6.jpg" alt=""/></a></span><div class="cover"><span class="film_title">Title 6</span></div></div> 
</div> 
</div> 

Comment puis-je accomplir cela avec les sélecteurs de jquery? Je pensais que je peux utiliser quelque chose comme:

$("div.items:nth-child(3n)").wrap('<div class="row"></div>'); 

Mais cela ne fonctionne pas. Des idées s'il vous plaît?

+0

Je trouve cette solution à l'aide très utile et facile wrapAll() à suivre: http://stackoverflow.com/questions/3366529/wrap-every-3-divs-in-a-div – willyp

Répondre

7

Je pense que ce que vous voulez réellement, c'est la gamme de divs entre 1 et 3, et pas seulement le troisième div, ouais?

Pour obtenir une plage, vous devez utiliser jquery slice.

1

Utilisez map(), slice() et wrapAll();

$(document).ready(function(){ 
     var results =[]; 
     var elements = $(".items").children('.boxgrid'); 
     $.map(elements , function(i, n){ 
      if(n%3 === 0){ 
       results.push(n); 
      } 
     }); 
     $.each(results , function(i,v){ 
      elements.slice(v, v+3).wrapAll('<div class="row"></div>'); 
     }); 
    }); 

Ceci a été testé et fonctionne.

+0

Je suis peut-être bête ici, mais n'utilisez-vous pas la carte comme si c'était chacun? - Ne pourriez-vous pas faire des résultats = $ .map (... et revenir n plutôt que de pousser sur les résultats? – Whisk

+0

vous avez raison et je pourrais être encore optimisé, il montre juste une façon de le faire. –

+0

La variable 'v' sera 0 la première itération, 1 la seconde, 2 la troisième etc ... Cette variable doit être incrémentée de 3 pour chaque itération afin que cet exemple fonctionne correctement est-ce que je ne suis pas correct? Sinon, vous allez juste envelopper les mêmes éléments et plus avec un seul nouvel élément à chaque itération.Cela peut être fait avec une boucle for par exemple (v + = 3) Je ne sais pas pourquoi utiliser un nom de variable comme 'v' soit.Est-ce pas beaucoup plus clair à appelez-le «index» ou «je» puisque c'est ce que c'est? – Operator

2

En tant que plugin:

jQuery.fn.wrapInChunks = function(html, chunkSize) { 

    chunkSize = chunkSize || 1; 

    var items = this.get(), 
     rows = [], 
     cur = rows[0] = $(html); 

    while (items[0]) { 

     if (rows[rows.length - 1].children().length === chunkSize) { 
      cur = rows[rows.length] = $(html); 
     } 

     cur.append(items.shift()); 

    } 

    return this.pushStack(rows); 

}; 

$('.boxgrid').wrapInChunks('<div class="row" />', 3).appendTo('.items'); 
0

Vous auriez à couper les éléments et faire de nouveaux éléments div pour contenir les éléments tranchés. Voici un exemple de code. Je ne connais pas de méthode plus simple pour le faire.

$(".items").each(function() 
{ 
    var rowDiv = document.createElement("div"); 
    $(rowDiv).addClass("row"); 

    for(i=0; i< $(this).find("> .boxgrid").length ; i+= 3) 
    { 
     $(rowDiv).append($(this).find("> .boxgrid").slice(i, i+3).clone());  
     $(this).append(rowDiv); 
     rowDiv = document.createElement("div"); 
     $(rowDiv).addClass("row"); 
    } 
    $(this).find("> .boxgrid").remove();//Remove all the immediate boxgrid child elements. 
}); 
Questions connexes