【问题标题】:jQuery clone() not cloning event bindings, even with on()jQuery clone() 不克隆事件绑定,即使使用 on()
【发布时间】:2012-03-03 20:35:32
【问题描述】:

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

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

以前有没有人遇到过这种情况,有人知道潜在的解决方法吗?我认为使用.on() 应该保留现在或将来存在的元素的绑定?

【问题讨论】:

  • “我认为使用 .on() 应该保留现在或将来存在的元素的绑定?” - 这与.clone 关系不大;这是 jQuery 的事件委托逻辑,如果你将一个额外的选择器传递给 .on,它就可以工作。

标签: javascript jquery


【解决方案1】:

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

$element.clone(true, true);

克隆([withDataAndEvents] [, deepWithDataAndEvents])

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

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


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

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

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

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

如果您在 #container 的父级上使用 .on(),则不需要这样做。

【讨论】:

  • 从来不知道.clone() 接受的论点。 FML。感谢您的帮助。
  • @DidierGhys 谢谢,我一直在为 .clone() 不克隆 .data()data-xxxx="somedata" 和 DOM 中的数据)而苦苦挣扎。这也解决了它!
  • 我问过这个Question,但没有人回答我。你能帮我吗?
  • 太好了,我必须创建一个click 事件来附加新的克隆 div。 ready 不工作
【解决方案2】:

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

有关此主题的更多信息:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多