2012-03-03 109 views
73

我已經創建了一系列定製的jQuery事件用於移動web應用程序。他們工作很好,並經過測試。但是,我遇到了一個我無法理解的小問題。jQuery的克隆()不克隆事件綁定,即使與on()

我在DOM中的一些元素上使用了.clone(),其中包含一個按鈕。該按鈕有一些自定義事件綁定到它(事件綁定使用.on()),但。不幸的是,當我使用jQuery的.clone()時,綁定不會被保留,我必須再次添加它們。

有沒有人遇到過這個,有人知道一個潛在的工作?我認爲使用.on()應該保留現在或將來存在的元素的綁定。

+0

「我認爲使用。對()應該保留現在存在,或在未來元素的結合?」 - 這與'.clone'無關;它是jQuery的事件委託邏輯,如果你將一個額外的選擇器傳遞給'.on',它就可以工作。 – pimvdb 2012-03-03 21:04:45

回答

166

我認爲你應該使用.clone()方法的這個重載:

$element.clone(true, true); 

克隆([withDataAndEvents] [,deepWithDataAndEvents])

withDataAndEvents:指示是否事件的布爾處理程序和數據應與元素一起復制。默認值是false。

deepWithDataAndEvents:布爾值,指示是否應複製克隆元素的所有子項的事件處理程序和數據。默認情況下,它的值與第一個參數的值相匹配(默認爲false)。


謹防.on()實際上並不綁定事件的目標,但你是委託給該元素。所以如果你有:

$('#container').on('click', '.button', ...); 

事件實際上綁定到#container。當發生點擊.button元素時,它會冒泡到#container元素觸發事件的元素在選擇器參數.on()上進行評估,如果匹配,則執行事件處理程序。這是事件代表團的工作方式。

如果您克隆元素#container,則必須深入克隆使用.on()進行的綁定的事件和數據才能保留。

如果您在#container的父母上使用.on(),則這不是必需的。

+11

不知道'.clone()'接受的參數。 FML。謝謝你的幫助。 – BenM 2012-03-03 20:43:57

+0

很高興幫助! – 2012-03-03 20:53:00

+1

@DidierGhys謝謝,我一直在努力'.clone()'不克隆'.data()'(包括'data-xxxx =「somedata」'和DOM中的數據)..這也解決了它! – 2013-05-24 10:13:53

4

您應該意識到事實上已將深度克隆功能添加到1.5 jQuery版本中。關於這一主題

更多信息:

http://api.jquery.com/clone/