3

当我将一些 dom 节点从一个上下文移动到另一个上下文时,所有一些子节点都失去了它们的事件侦听器。

HTML

<div><lots of deep nodes .../><div>
<div>
   <div>
     <div#newNode></div>
   </div>
</div>

JS

nodes = $('div').find('nodes')
$('#newNode').html(nodes)

移动之后……所有移动的节点都丢失了它们的事件。

有什么想法吗?

4

3 回答 3

2

您正在复制 html,它没有任何事件信息。

你想用.clone(true)

$('.whatToCopy').clone(true).appendTo('#NewLocation');
于 2013-01-29T01:10:44.117 回答
2

重构或复制 HTML 会生成全新的 DOM 元素,这些元素没有任何先前节点的事件侦听器(这些元素是从头开始创建的,就像页面中的原始 HTML 创建的元素没有事件侦听器一样)。因此,很自然,除非您运行新代码向它们添加事件监听器,否则它们上不会有任何 jQuery 事件监听器。

如果您想移动节点,您可以直接将 DOM 元素移动到 DOM 中的不同位置,而无需使用 HTML(因此无需制作新的 DOM 元素),因此所有事件侦听器都保持连接状态。例如移动它们:

nodes = $('div').find('nodes');
$('#newNode').append(nodes);

如果要复制附加了事件侦听器的节​​点,则可以使用.clone(true, true)它将克隆带有数据和事件的节点并进行深度克隆(包括子节点):

nodes = $('div').find('nodes');
$('#newNode').append(nodes.clone(true, true));

有关更多信息,请参阅jQuery 参考。.clone()

于 2013-01-29T01:13:38.990 回答
1

尝试使用 append 或 prepend on $('#newNode').html()重新创建标签,这样你就失去了所有的事件和东西

于 2013-01-29T01:13:19.177 回答