jQuery оборачивает все элементы X в div

У меня есть список элементов (div), которым предшествует тег H3.

<h3></h3>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<h3></h3>
<div class="item"></div>
<div class="item"></div>

и т.д...

Используя jQuery, я хотел бы сгруппировать каждые 3 div (или меньше), за которыми следует каждый h3 следующим образом:

<h3></h3>
<div class=row>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>
<div class=row>
    <div class="item"></div>
</div>
<h3></h3>
<div class=row>
    <div class="item"></div>
    <div class="item"></div>
</div>

Я попробовал решение, предложенное здесь: Вставить ‹div› для каждых 5 элементов, используя Javascript, но он, очевидно, сгруппировал ВСЕ элементы div. Я также безуспешно пытался использовать ~ selector:

var a = $('h3 ~ div.item');

for( var i = 0; i < a.length; i+=3 ) {
    a.slice(i, i+3).wrapAll('<div class="row"></div>');
}

Любая помощь будет высоко оценена.


person Daniel Sachs    schedule 07.07.2012    source источник


Ответы (4)


Я закончил с этим, и это работает

$(function(){
    var h3=$('h3');
    h3.each(function(){
        var divs=$(this).nextUntil('h3');
        var row_wreapper=$('<div></div>');
        while(divs.length)
        {
            var grp=divs.splice(0, 3);
            var row=$('<div class="row"></div>');
            $(grp).each(function(){
                row.append($(this));
            });
            row_wreapper.append(row);
        }
        $(this).after(row_wreapper.html());
    });
});​

DEMO или с небольшой дополнительной проверкой класса item ДЕМО.

Or

$(function(){
    var h3=$('h3');
    h3.each(function(){
    var divs=$(this).nextUntil('h3');
    var row_wreapper=$('<div></div>');
    while(divs.length)
    {
        var grp=divs.splice(0, 3);
        var row=$(grp).wrapAll('<div class="row"></div>');
        if(row.children().length) row_wreapper.append(row);
    }
    $(this).after(row_wreapper.html());
    });
});​

ДЕМО.

person The Alpha    schedule 07.07.2012
comment
Хорошо, это работает с jQuery уже в версии 1.4.4. Большое спасибо! - person Daniel Sachs; 07.07.2012
comment
Добро пожаловать и вот еще, вам может понравиться это. :-) - person The Alpha; 07.07.2012

Здесь есть плагин, который я использую, когда хочу обернуть, просто потому, что он чистый и позволяет мне делать потрясающие вещи. || Здесь вы можете найти исходный код оболочки в текстовом виде

Единственная проблема заключается в том, что из-за вашей модели DOM нам нужно структурировать все элементы и сгруппировать их, прежде чем мы сможем перебирать эти списки.

Сначала мы сделаем это с помощью ->

$.each($('h3'), function(i,v){
  $(v).nextUntil($('h3')).wrapAll('<div class="row-container"></div>');    
});

.nextUntil() — это jQuery 1.6+, так что, надеюсь, там нет ограничений.

Теперь, с плагином выше, на который я ссылался, мы можем ссылаться на него и заставлять его оборачивать объекты в каждый новый row-container.

$.each($('.row-container'), function(i,v){
  $(v).nwrapper({
    wrapEvery      : 3,
    defaultClasses : false,
    extraClasses: ['row']     
  });
});

Доказательство готово, так что вот jsFiddle

person Ohgodwhy    schedule 07.07.2012
comment
Спасибо за это! Правильный подход, но я думаю, что решение @thecodeparadox проще. В любом случае это решение также работает. - person Daniel Sachs; 07.07.2012

Попробуй это. Простое решение..

var h3s = $('h3');   // caching all h3 tags

// looping over h3 tags
$.each(h3s, function(i, hs) {

    // selecting div.item between two h3
    // for example
    // div.item between this (current h3) and h3:eq(1) (next h3) and so on

    var divs = $(this).nextUntil($('h3').eq(i+1), 'div.item');

    // looping with divs
    $.each(divs, function(i, el) {

        // checking for div.item
        // to group for wrapping

        if(i % 3 == 0) {
            divs.slice(i , i+3).wrapAll('<div class="row">');
        }
    });
});

Рабочий образец

Связанные ссылки:

person thecodeparadox    schedule 07.07.2012
comment
Привет @thecodeparadox, если бы я хотел использовать nextUntil() с jquery 1.4.4 (который использует селектор, а не элемент), как мне его использовать? Добавление класса к H3? - person Daniel Sachs; 07.07.2012

Вы можете сделать что-то вроде этого:

(function(c, h, s, $g, n) {
    $(c).find([h,s].join()).each(function() {
        if ($(this).filter(h).length || $g.find(s).length == n) {
            $g = $g.clone().empty().insertAfter(this);
        }
        $g.append($(this).not(h));
    });
})(document, 'h3', '.item', $('<div class="itemGroup"/>'), 3);

Если ваши элементы содержатся в определенном контейнере, передайте селектор контейнера (например, "#myContainer") вместо document.

ДЕМО

person Beetroot-Beetroot    schedule 07.07.2012
comment
Отредактировано, чтобы быть более кратким и адаптируемым. - person Beetroot-Beetroot; 09.07.2012