2012-08-15 63 views
0

克隆我尝试提供一个预定义的对象以后克隆它并填充更多功能的克隆。我面临的问题是,我可以克隆这些对象,但之后只有其中一个被附加到DOM。克隆对象多次,并附加jQuery的

到目前为止的代码是:

var foo = jQuery.extend({}, Grab); 
var bar = jQuery.extend({}, Grab); 

$('body').append(foo); 
$('body').append(bar); 

我用jQuery.extend()因为我需要抓住的.daggable功能与克隆。

任何建议高度赞赏!

+0

你可以用'.clone( '真', '真')' – undefined 2012-08-15 14:03:46

+0

是'Grab' DOM元素?使用[jQuery'.clone()'](http://api.jquery.com/clone/) – nbrooks 2012-08-15 14:04:05

+0

是的,Grab是一个DOM元素。它在另一个地方填充了一些css和.draggable()。 要保留.draggable()我需要使用.extend()而不是.clone()。否则,克隆准备好的对象的整个想法会浪费精力,而且会产生大量冗余代码。 – zoku 2012-08-15 14:10:54

回答

5

如果Grab是一个元素,你通常应该使用.clone(true, true)复制它,而不是$.extend()

true参数会导致它是原始对象的深层副本。

然而,这可能不会正确地复制拖动设置。只是因为该对象已被克隆,您不能保证所有状态都已被复制。特别是如果任何可拖动状态存储在词汇范围的私有变量中,它将不起作用。

同样任何其他设置,该.draggable功能确实在第一时间它添加到元素不会被要么完成了。恕我直言,你最好的办法是用.clone(false)做一个浅拷贝,然后在副本上调用.draggable,然后重新附加他们的事件处理程序。

+0

Alnitak是正确的,当你使用'.clone()'你正在复制元素和所有的类和属性。如果您的可拖动设置基于事件处理程序,那么您可以使用深度复制可选参数来克隆事件处理程序。但是,根据管理元素状态的方式,您仍然可能会发现一些问题 – 2012-08-15 14:07:59

+0

对此,有些重复数据感到抱歉。我没有看到他的编辑,直到我写完我的评论 – 2012-08-15 14:09:45

+0

不幸的是.clone()是在这一点上没有选择,因为它不正确地复制连接事件(可拖动的功能丧失)。它*克隆对象,并让它可以附加到DOM,但! – zoku 2012-08-15 14:16:44