Reputation: 77
i don't have access to some back-end stuff and i have no help. this is what i need to do, i need jquery code that will find the second class "text" and put it and the following li's in a new ul.
this
<ul>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
to this
<ul>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
<ul>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
I've tried a bunch of code but cant get it to work, any suggestions?
Upvotes: 0
Views: 224
Reputation: 123739
How about this:
$('ul').find('li.text').unwrap().each(function () {
$(this).nextUntil('.text').andSelf().wrapAll($('<ul/>'));
});
It doesn't matter how many li.text's are there and how many groups you need to create and doesn't leave elements unwrapped and abandoned with the help of chaining.
Upvotes: 0
Reputation: 33870
In case you have more than 2 ul
to do, you can use this code :
$('li').unwrap()
$('.text').each(function(){
$(this).nextUntil('.text').addBack().wrapAll('<ul>')
})
Fiddle : http://jsfiddle.net/HBXNk/
Upvotes: 0
Reputation: 44740
$('ul .text').eq(1).prev().nextAll().appendTo($('<ul>').insertAfter('ul:first'));
Demo -->
http://jsfiddle.net/RhMj9/5/
Upvotes: 0
Reputation: 514
I prefer to do this using the most efficient way:
First, I add a custom class name (named 'first') to the first occurence of class 'text'.
<ul>
<li class="text first">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
Then, use jQuery function to find and replace the string to what we want:
var myHTMLcontent = $("ul").html();
var newContent=myHTMLcontent.replace('<li class="text">','</ul><ul><li class="text">');
$("ul").html(newContent);
Hope this helps
Upvotes: 0
Reputation: 207861
This oughta do it:
$('li.text:first').nextUntil('li.text').addBack().wrapAll('<ul>');
$('li.text:eq(1)').nextAll().addBack().wrapAll('<ul>');
$('li.text:first').closest('ul').unwrap();
Will produce:
<ul>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
<ul>
<li class="text">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
<li class="subText">TEXT</li>
</ul>
Upvotes: 2
Reputation: 1787
look into JQuery .wrap
// do some checks
$(".someclass").wrap("<ul></ul>");
Upvotes: 0
Reputation: 37369
Something like $("ul li")
will return all of the list items in the order that they appear in the DOM. You can then loop through them and as soon as you find the second one, just do something like:
$("li").before("</ul><ul>")
EDIT: Sorry, use before()
not prepend()
.
Upvotes: 0