JohnDoo
JohnDoo

Reputation: 103

How to append all DIV starts with class and repeat this proc again?

Let me explain it direct in code:

I have:

<dl class="ctx accordion">
   <dt>headline<a>x</a></dt>
   <dd><!----></dd>
</dl>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>

<dl class="ctx accordion">
   <dt>headline<a>x</a></dt>
   <dd><!----></dd>
</dl>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>

<dl class="ctx accordion">
   <dt>headline<a>x</a></dt>
   <dd><!----></dd>
</dl>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>
<p class="ctx">Lorem ipsum dolor sit amet, consetetur sadipscing elitr</p>

And i want to accomblish that all .ctx:not('.accordion') go into the prev .accordion dd and so on

Here is my try:

     $('.accordion').each(function(index) {

     var nextCTX = $(this).nextAll('.ctx').not('.accordion');
     $(this).find('dd').append(nextCTX);
 });

But it dont work well. In this example i catch everything with .ctx and put it into the first .accordion dd

whats wrong?

#

EDIT

i need a solution to stop the accordion loop. my current looks like: $('.accordion dd').append(function() { return $(this).closest('.accordion').nextUntil('.accordion').filter('.ctx:not(".stopLast")'); });

in this case the loop cant stop an include everything after a elem with .stopLast

Upvotes: 0

Views: 80

Answers (4)

Ben Jackson
Ben Jackson

Reputation: 11932

Assuming that the .accordion elements will always be siblings of .ctx:not('.accordion'), then you can use:

$('.ctx.accordion').each(function () {
    var $this = $(this),
        $elemsToMove = $this.nextUntil('.accordian', '.ctx');

    $this.find('dd').append($elemsToMove);
});

http://jsfiddle.net/BYossarian/phDdz/

Upvotes: 1

adeneo
adeneo

Reputation: 318222

Target the elements that you wish to append to, and then find all elements that match p.ctx until the next .accordion

element :

$('.accordion dd').append(function() {
    return $(this).closest('.accordion').nextUntil('.accordion').filter('p.ctx');
});

FIDDLE

Upvotes: 2

Try .nextUntil()

$('.accordion').each(function (index) {
    var nextCTX = $(this).nextUntil('.accordion').filter('.ctx');
    $(this).find('dd').append(nextCMP);
});

Upvotes: 1

Anton
Anton

Reputation: 32581

Try this

$('.accordion').filter(function () {
    $(this).nextUntil('.accordion').filter('.ctx').appendTo($(this).find('dd'));
});

DEMO

Upvotes: 1

Related Questions