8
votes

Puis-je. $ .Wrap () autour d'une collection d'éléments dans un tableau?

Disons que j'ai une collection d'éléments de "articles" comme:

p>

<p class="item">Item 1</p>
<p class="item">Item 2</p>
<div class="wrapper">
  <p class="item group">Item 3</p>
  <p class="item group">Item 4</p>
</div>
<p class="item">Item 5</p>
<div class="wrapper">
  <p class="item group">Item 6</p>
  <p class="item group">Item 7</p>
  <p class="item group">Item 8</p>
</div>
<p class="item">Item 9</p>


2 commentaires

Ne voulez-vous que grouper des ensembles contigus de group éléments? I.E. Pourriez-vous avoir deux groupes dans une liste, qui doivent être conservés séparés?


@Alnitak, tu as raison de m'empêcher de te tenir quelque chose de toi. Ceci est bien correct, il peut potentiellement être plusieurs «ensembles» de groupes qui sont chacun enveloppés. Je mettrai à jour ma question, mais oui, je joue avec Jsfiddle et c'est douloureusement lent ...


3 Réponses :


8
votes

Essayez enveloppement code> méthode à la place:

$(".group").map(function() {
    if (!$(this).prev().hasClass("group")) {
        return $(this).nextUntil(":not(.group)").andSelf();
    }
}).wrap("<div class='wrap' />");


2 commentaires

Vision, je vais utiliser cela dans mon code, veuillez vous procéder s'il y a des problèmes liés à la licence CC. C'est super facile et utilise ce que j'ai initialement aimé à propos de JQuery, mais s'est écarté d'après avoir appris JavaScript plus ... c'est-à-dire la simplicité des commandes simples à cordes pour atteindre tellement !. En outre, j'ai appris deux nouvelles méthodes . Et) et .map () méthode pour produire un .wrapall () effet.


@AlexanderDixon content que vous ayez trouvé cela utile. N'hésitez pas à utiliser le code partout où vous le souhaitez. BTW, envisagez d'utiliser addack au lieu de , car ce dernier est maintenant obsolète.



4
votes

Utiliser enveloppant au lieu d'envelopper.

var group = [];
        $(".item").each(
          function(i, item) {            
            if ($(item).hasClass("group")) {
                group.push(item);
            }
            else {
                $(group).wrapAll('<div class="wrap" />');
                group = [];
            }
          }
        );


0 commentaires

5
votes

Vous pouvez utiliser une combinaison de .filter et .map pour obtenir le résultat souhaité: xxx

le voir en action .

Exemple sur JS bin pour contourner les problèmes actuels de Jsfiddle.

Justification

la méthode .wrap Incorçons Chaque élément à l'intérieur de l'objet JQuery actuel à l'intérieur du marquage de votre choix. Il s'ensuit que si vous souhaitez envelopper plusieurs éléments dans le même wrapper, vous devez correspondre à ces n éléments avec un objet JQuery, puis créer un autre objet JQuery contenant un élément: le premier objet JQUERY. C'est ce dernier objet que vous devriez passer à .wrap .

Alors, ce que nous devons faire ici est de créer un objet jQuery pour chaque groupe, puis mettez tous ces éléments dans un autre Objet "Master" JQuery. Commencez par sélectionner tous les éléments .group éléments qui ne sont pas eux-mêmes précédés par un .group frère: xxx

de chacun élément, créez un objet jQuery qui inclut l'élément et tous les frères et sœurs suivants avec .group : xxx

Les objets jQuery résultants sont automatiquement placés à l'intérieur " Master "objet parce qu'ils prennent la place des éléments nus que nous avons sélectionnés avec .filter à l'intérieur de l'objet JQuery que nous avons créé avec $ (". item.group ") . Un appel final à .wrap ... enveloppe les choses. :)


1 commentaires

Il a fallu environ 4 ans mais, des félicitations à vous pour le .wrap () punk. J'ai compris! Aussi, merci pour cette impressionnante réponse et explication.