7

我有一个 H3 标签 preseded 的元素(div)列表

<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>

ETC...

使用 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>

我尝试了这里提出的解决方案:使用 Javascript 为每 5 个元素插入 <div> , 但它显然将所有 div 分组。我也尝试使用 ~ 选择器但没有成功:

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

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

任何帮助将不胜感激。

4

4 回答 4

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());
    });
});​

DEMOitem或对 DEMO类进行一些额外检查

或者

$(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());
    });
});​

演示。

于 2012-07-07T17:49:21.293 回答
2

这里有一个插件,当我想包装时我会使用它,只是因为它很干净并且可以让我做一些令人惊奇的事情。|| 您可以在此处以纯文本形式找到包装器的来源

唯一的问题是 - 由于您的 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

于 2012-07-07T16:34:30.883 回答
2

试试这个。一个简单的解决方案..

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">');
        }
    });
});

工作样本

相关参考:

于 2012-07-07T16:38:09.390 回答
1

你可以这样做:

(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.

演示

于 2012-07-07T18:22:18.850 回答