私はこの小さなラッパープラグインを使用しています:
https://github.com/tsevdos/nwrapper
(function($) {
$.fn.nwrapper = function(options){
var defaults = {
wrapEvery : 1,
defaultClasses : true,
extraClasses : false,
htmlStructure : 'div'
};
settings = $.extend({}, defaults, options);
var elements = $(this).children();
var elementsLen = elements.length;
for ( var i = 0, numb = 1; i < elementsLen; i += settings.wrapEvery, numb++ ){
// Default Classes Array
var classes = [];
if ( settings.defaultClasses ) {
classes[0] = 'wrapper';
classes[1] = 'wrapper-' + numb;
if (numb==1) {
classes[2] = 'first';
}
if (numb==Math.ceil(elementsLen/settings.wrapEvery)) {
classes[2] = 'last';
}
}
// Merge Default class with Extra Class
if ( settings.extraClasses ) {
$.merge( classes, settings.extraClasses );
}
// If you find any classes crete the class string
if ( classes.length > 0 ) {
htmlClassesString = 'class="' + classes.join(" ") + '"';
} else {
htmlClassesString = '';
}
elements.filter(':eq(' + i + '), :lt(' + (i + settings.wrapEvery) + '):gt(' + i + ')').wrapAll('<' + settings.htmlStructure + ' ' + htmlClassesString + ' />');
}
return $(this);
};
})(jQuery);
基本的なレイアウトは次のとおりです。
<div id="container">
<div class="filter1">Value</div>
<div class="filter2">Value</div>
<div class="filter3">Value</div>
<div class="filter1">Value</div>
<div class="filter2">Value</div>
<div class="filter3">Value</div>
<div class="filter1">Value</div>
<div class="filter2">Value</div>
<div class="filter3">Value</div>
...
</div>
プラグインの初期化:
$('#container').nwrapper({ wrapEvery : 3 });
子 div を非表示/表示してからプラグインを再初期化する選択フィルターを使用します。非表示の div をラップ カウントから除外することは可能でしょうか?
最後に、jQuery サイクルを使用してラップされた div を表示するため、非表示の div はラップ内にある必要があります (カウントされません)。それ以外の場合、サイクルは各非表示の div をアイテムとして扱います。
おそらく、このプラグインは、私が達成しようとしていることに最適なツールではありません。以下が生成されます。
3 つの表示 div ごとにラップしたいのですが、非表示の div も含めます。
<div id="container">
<div class="wrapper wrapper-1 first">
<div class="filter1">Value</div>
<div class="filter2">Value</div>
<div class="filter3" style="display:none;">Value</div>
<div class="filter1">Value</div>
</div>
<div class="wrapper wrapper-2 last">
<div class="filter2">Value</div>
<div class="filter3" style="display:none;">Value</div>
<div class="filter1">Value</div>
<div class="filter2">Value</div>
<div class="filter3" style="display:none;">Value</div>
</div>
</div>