jQuery包含多个独立于level的元素
这是我在stackoverflow上的第一篇文章。 到目前为止,我总能找到答案,但这次我不能。
这是我的DOM结构:
如何将2个或更多选定的“随机”元素包装到包装容器中? 如果所选元素位于不同级别并且其间存在其他元素,那么这也应该有效。 更新:不应影响所有其他元素的DOM结构。
举几个例子:
例1:
我虽然喜欢这样的东西:
var element1 = $('#elementB'); var element2 = $('#elementE'); ??? $(element1, element2).myWrap(".wrapper"); ???
结果应如下所示:
2示例:
元素处于不同的层次。
var element1 = $('#elementD'); var element2 = $('#elementE'); ??? $(element1, element2).myWrap(".wrapper"); ???
结果:
示例3:超过2个元素:
var element1 = $('#elementD'); var element2 = $('#elementC'); var element3 = $('#elementA'); ??? $(element1, element2, element3).myWrap(".wrapper"); ???
示例4:不同的树:
var element1 = $('#elementD'); var element2 = $('#elementF'); ??? $(element1, element2).myWrap(".wrapper"); ???
谢谢你的帮助提前。
正如上面的评论中所指出的,第一个例子与其他例子不同,因为当指定的孩子都是直接的后代时,那么共同父母中的所有孩子都应该被包裹。
使用此逻辑,以下解决方案有效。
jQuery.fn.myWrap = function(options) { var e = this; // find most nested var max = null; var $mostNested = null; $(e).each(function(i, elem) { var parents = $(elem).parents().length; if (parents > max || max == null) { max = parents; $mostNested = $(elem); } }) // find common parent var found = false; $parent = $mostNested.parent(); while($parent != null && !found) { if ($parent.find(e).length == e.length) { // Right Level found = true; var toWrap = []; var numDirect = 0; $.each($parent.children(), function(i, item) { var direct = $(e).index(item) >= 0; var sibling = $(item).find(e).length > 0; if (direct) numDirect++; if (direct || sibling) toWrap.push(item); }) if (numDirect == e.length) { // All direct! (Example 1) $parent.children().wrapAll(""); } else { // Other Examples $(toWrap).wrapAll(""); } } $parent = $parent.parent(); } }; $(document).ready(function() { // Example 1 $('#elementB, #elementE').myWrap(); // Example 2 //$('#elementD, #elementE').myWrap(); // Example 3 //$('#elementD, #elementC, #elementA').myWrap(); // Example 4 //$('#elementD, #elementF').myWrap(); })
看我的小提琴 。