2009-06-15 9 views
3

J'ai tout un tas d'éléments dont j'ai besoin de regrouper, mais parce qu'il est craché de certaines machines que je ne peux pas modifier, je dois le faire en utilisant jquery (que j'ai m assez familier avec les bases de)utiliser jquery pour grouper des éléments

Fondamentalement, j'ai une charge de p tags et divs lâche à l'intérieur d'un élément de formulaire (oui mauvais balisage, mais c'est une autre histoire). J'ai besoin de regrouper les p tags avec le ou les deux div suivants dans un fieldset.

J'ai essayé d'insérer fieldset près et balise de début avant chaque élément p, mais je suppose que la machine qui trie en veut insérer des éléments juridiques, de sorte que cela ne fonctionne pas

+1

isnt particulièrement clair ce que vous essayez de faire. – gubby

+0

Ok, je vais essayer de l'effacer. J'ai quelque chose comme ceci: p div div p div div p div p div Ce que je dois le faire groupe chaque élément p avec un ou deux divs suivants à l'intérieur d'un fieldets element – chrism

Répondre

7

Si je comprends bien, vous avez un document dans lequel le balisage ressemble à ceci:

<p>paragraph 1</p> 
<div>par1 div1</div> 
<div>par1 div2</div> 
<p>paragraph 2</p> 
<div>par2 div1</div> 
<div>par2 div2</div> 
<p>paragraph 3</p> 
<div>par3 div1</div> 
<p>paragraph 4</p> 
<div>par4 div1</div> 

Et vous voulez finir avec quelque chose comme ceci:

<fieldset> 
<p>paragraph1</p> 
<div>par1 div1</div> 
<div>par1 div2</div> 
</fieldset> 
<fieldset> 
<p>paragraph2</p> 
<div>par2 div1</div> 
<div>par2 div1></div> 
</fieldset> 
..... 

Si tel est le c ase, alors cet extrait jQuery fera l'affaire:

$(function(){ 
    $('p').each(function(index,item){ 
     var nextDiv = $(item).next(); 
     var followingDiv = $(nextDiv).next('div'); 
     $(item).wrap("<fieldset id='fieldset" + index + "'></fieldset>"); 
     $("#fieldset"+index).append(nextDiv).append(followingDiv); 
    }); 
}); 
+0

Merci, je trouverais quelque chose de similaire, mais pas aussi succinct que le vôtre. – chrism

1

@ réponse de JoseBasillo peut être simplifié et généralisé un peu:

var $wrapper = $('#wrapper'); 
$wrapper.children('p').each(function(index,item) { 
    var $following = $(item).nextUntil('p, fieldset'); 
    $wrapper.append($('<fieldset>').append(item, $following)); 
}); 

Demo

Le code convertit

<div id="wrapper"> 
    <p>paragraph 1</p> 
     ... (whatever but p or fieldset) 
    <p>paragraph 2</p> 
     ... (whatever but p or fieldset) 
    ... (p followed by whatever but p or fieldset) 
</div> 

en

<div id="wrapper"> 
    <fieldset> 
     ... (whatever but p or fieldset) 
    </fieldset> 
    <fieldset> 
     ... (whatever but p or fieldset) 
    </fieldset> 
    ... (fieldset containg [p followed by whatever but p or fieldset]) 
</div> 

Si quelqu'un préfère code plus court que la lisibilité, il n'y a pas besoin d'utiliser la variable $following:

var $wrapper = $('#wrapper'); 
$wrapper.children('p').each(function(index,item) { 
    $wrapper.append($('<fieldset>').append(item, $(item).nextUntil('p, fieldset'))); 
}); 
Questions connexes