2011-04-18 102 views
8

jQuery的wrap()方法不换行使用元素创建,但重复:用另一个包装一个元素,保留对包装的引用?

var $orig = $('p'); // some existing element 
var $wrap = $('<div>').css({border:'1px solid red'}); 
$orig.wrap($wrap); 
$wrap.append('<p>SMOKE YOU</p>'); // does not appear after the original element 

如果你不相信,你可以在这里看到上面的真人版:http://jsfiddle.net/QRmY6/

我如何最好创建非平凡的动态内容以包裹现有节点,同时保留对包装的引用,最终围绕内容

+0

此相关的问题没有解答,需要保留提及包装:http://stackoverflow.com/questions/4190946/jquery-how-to-create-元素然后包裹这个另外存在的元素 – Phrogz 2011-04-18 18:40:23

回答

4

我想出的最好的选择是:

// Technique 1 - swap it out and then embed it via append 
var $wrap = $('<div>').css({border:'1px solid red'}); 
$orig.replaceWith($wrap); 
$wrap.append($orig); 

// Technique 2 - create it inline and then modify it 
var $wrap = $orig.wrap('<div>').parent().css({border:'1px solid red'}); 
+0

所有那些'$'想让我呕吐。这不是PHP。 – ThiefMaster 2011-11-07 10:07:37

+5

@ThiefMaster我对你的胃肠状态表示歉意。 :)我们中的一些人选择用'$'作为变量的前缀变量作为迷你匈牙利语符号提示,表示变量包含jQuery对象而不是DOM对象。 – Phrogz 2011-11-07 13:40:51

1

虽然这已经是很久以前问,它仍然是一个问题(如2015年6月)的jQuery中(v1.11.1)。这里是我的解决办法,这感觉有点..嗯,应该说“特殊”,但工作仍然:

var $orig = $('p'); // some existing element 
var $wrap = $('<div>').css({border:'1px solid red'}); 

$wrap = $orig.wrap($wrap).parent(); //the object that is being wrapped is returned, so selecting its parent will get the wrapper. Re-setting that in the $wrap variable will retain the wrapper for reference 

$wrap.append('<p>SMOKE YOU</p>'); // this will now work 

注:需要注意的是,$wrap元素不再是可重复使用的包装,因为它现在包含$orig元素。解决方法是通过使用另一个“特殊”的方式add()

var $orig = $('p'); // some existing element 
var $wrap = $('<div id="wrapper">').css({border:'1px solid red'}); 

$wrap = $wrap.add($orig.wrap($wrap.clone().empty()).parent()); //the object that is being wrapped is returned, so calling for its parent will return the wrapper. 

$wrap.append('<p>SMOKE YOU</p>'); // this will now work 

$wrap = $wrap.add($('div.otherdiv').wrap($wrap.clone().empty()).parent()) 

console.log($wrap); //as you can see the $wrap variable now contains two divs 

$wrap.css({'border' : '1px solid blue'}); //this will now work on all wraps 

这不是很清楚的代码,但它的工程!查看this Fiddle作为一个工作示例。

0

奇怪的是,jQuery不够聪明,以保持参考。下面是一个简单的香草JS方式:

orig.parentNode.replaceChild(wrapper,orig); 
wrapper.appendChild(orig);