2012-08-15 61 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