2010-08-13 18 views
38

Wie würde ich mit wrap() gehen, um mehrere Elemente (mit verschiedenen Klassen) innerhalb einer <div> zu wickeln?jQuery - Verwenden Sie wrap(), um mehrere Elemente zu umhüllen?

Zum Beispiel auf dem Formular auf ich arbeite gibt es eine große Liste von Kontrollkästchen Ein- und Etiketten in Form von:

<input> 
<label> 
<input> 
<label> 

etc

Ich will ein <div> wickeln um den Eingang und das Etikett, so würde das Ergebnis sein:

<div> 
    <input> 
    <label> 
</div> 
<div> 
    <input> 
    <label> 
</div> 

Danke!

Antwort

89

Sie verwenden können.

$('form > input').each(function(){ 
    $(this).next('label').andSelf().wrapAll('<div class="test"/>'); 
}); 

Wenn Ihr Markup immer genau die gleiche Reihenfolge hat, würde ich verwenden möchten:

var $set = $('form').children();  
for(var i=0, len = $set.length; i < len; i+=2){ 
    $set.slice(i, i+2).wrapAll('<div class="test"/>'); 
}  

Sollte signifikant schneller sein.

Ref .: .wrapAll(), .andSelf(), .slice()

+2

Dies ist wahrscheinlich der beste Weg, dies zu tun. – RaYell

+0

Perfekt, genau was ich wollte, vielen Dank. – Probocop

+0

Seltsamerweise habe ich das gerade auf JS Fiddle versucht, und es scheint nicht zu funktionieren; Die Antwort von James, gleich darunter, tut es jedoch. – user1729506

0

jQuery-Funktion wrapAll können Sie mehrere Elemente umschließen, aber wenn Sie ein DOM wie Sie haben, dann wird es nicht so gut funktionieren, wie Sie einen Teil der Beschriftung und Eingabe mit einem Selektor nicht einfach übereinstimmen können. Ich empfehle, jedem Teil einige Klassen hinzuzufügen und dann wrapAll zu verwenden.

<input class="i1"/> 
<label class="i1"/> 
<input class="i2"/> 
<label class="i2"/> 

$('.i1').wrapAll('<div/>'); 
$('.i2').wrapAll('<div/>'); 

Dies wird Ihnen die .wrapAll() Methode geben

<div> 
    <input class="i1"/> 
    <label class="i1"/> 
</div> 
<div> 
    <input class="i2"/> 
    <label class="i2"/> 
<div> 
4
$('input+label').each(function(){ 
    $(this).prev().andSelf().wrapAll('<div>'); 
});​ 
1

Wenn Sie so etwas wie dieses:

<input id="input1"> 
<label id="label1"> 
<input id="input2"> 
<label id="label2"> 

Dann können Sie mit jQuery:

jQuery("#input1").next().andSelf().wrapAll('<div id="newDiv" />'); 
jQuery("#input2").next().andSelf().wrapAll('<div id="newDiv" />'); 

und erhalten diese:

<div id="newDiv"> 
    <input id="input1"> 
    <label id="label1"> 
</div> 
<div id="newDiv"> 
    <input id="input2"> 
    <label id="label2"> 
</div> 

für mich gearbeitet :-)

Verwandte Themen