jQuery clone()没有克隆事件绑定,即使是on()

时间:2012-03-03 20:35:33

标签: javascript jquery

我创建了一系列用于移动Web应用程序的自定义jQuery事件。它们运行良好且经过测试。但是,我遇到了一个小问题,我无法理解。

我在DOM中的一些元素上使用.clone(),其中包含一个按钮。该按钮具有绑定到它的一些自定义事件(事件使用.on()绑定),但是。不幸的是,当我使用jQuery的.clone()时,绑定不会被保留,我必须再次添加它们。

之前是否有人遇到此问题,是否有人知道潜在的工作?我认为使用.on()应该保留现在或将来存在的元素的绑定?

2 个答案:

答案 0 :(得分:194)

我认为您应该使用.clone()方法的重载:

$element.clone(true, true);
  

clone([withDataAndEvents] [,deepWithDataAndEvents])

     

withDataAndEvents :一个布尔值,指示是否应将事件处理程序和数据与元素一起复制。默认值为false。

     

deepWithDataAndEvents :一个布尔值,指示是否应复制克隆元素的所有子项的事件处理程序和数据。默认情况下,其值与第一个参数的值匹配(默认为false)。


请注意.on()实际上并未将事件绑定到目标,而是绑定到您委派的元素。所以如果你有:

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

事件实际上绑定到#container。当单击.button元素时,它会冒泡到#container元素触发事件的元素将根据.on()的选择器参数进行评估,如果匹配,则为事件处理程序被执行。这就是事件委托的工作方式。

如果克隆元素#container,则必须使用保留.on()的绑定的事件和数据进行深度克隆。

如果您在.on()的父级上使用#container,则无需执行此操作。

答案 1 :(得分:4)

您应该知道深度克隆功能已添加到1.5 jQuery版本。

有关此主题的更多信息:

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