Jquery for wrapping elements
I have this code and every 3 I need to wrap with a div
(original)
<div id="entries"> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> </div> (should become)
<div id="entries"> <div> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> </div> <div> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> </div> <div> <a class="thumbnaila"><img class="thumbnail" alt="" src="blabla"/></a> </div> </div> +1
Zaviola
source share4 answers
I put together this plugin that does a great job
(function($){ $.fn.wrapChildren = function(options) { var options = $.extend({ childElem : undefined, sets : 1, wrapper : 'div' }, options || {}); if (options.childElem === undefined) return this; return this.each(function() { var elems = $(this).children(options.childElem); var arr = []; elems.each(function(i,value) { arr.push(value); if (((i + 1) % options.sets === 0) || (i === elems.length -1)) { var set = $(arr); arr = []; set.wrapAll($("<" + options.wrapper + ">")); } }); }); } })(jQuery); You pass an options object defining
childElem- nodeType element for immediate children to carrysets- how you want to group the children. For example, sets of 3 in your case. Default 1wrapper- an element for wrapping children. default -<div>
Use your test data as well.
$(function() { $('#entries').wrapChildren({ childElem : 'a' , sets: 3}); }); Here is a working demo . Add / edit to the url to play with the code.
EDIT:
I am trying to make this a more complete plugin if this proves useful. .
I created an improved version of the plugin
+5
var $c = $('#entries'); while ($c.children('a').length) { $c.children('a:lt(3)').wrapAll('<div>'); } working demo (albeit with a different HTML structure) at http://jsfiddle.net/alnitak/sppgP/
0