如何使用事件侦听器复制 DOM 节点?

新手上路,请多包涵

我试过了

node.cloneNode(true); // deep copy

它似乎没有复制我使用 node.addEventListener("click", someFunc); 添加的事件监听器。

我们使用 Dojo 库。

原文由 Chakradar Raju 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 784
2 个回答

cloneNode() 不复制事件侦听器。事实上,一旦附加了事件监听器,就无法通过 DOM 获取事件监听器,因此您的选择是:

  • 手动将所有事件侦听器添加到克隆节点
  • 重构您的代码以使用事件委托,以便所有事件处理程序都附加到包含原始和克隆的节点
  • 使用围绕 Node.addEventListener() 的包装函数来跟踪添加到每个节点的侦听器。例如,这就是 jQuery 的 clone() 方法能够复制带有事件侦听器的节点的方式。

原文由 Tim Down 发布,翻译遵循 CC BY-SA 3.0 许可协议

这并不能准确回答问题,但如果用例允许 移动 元素而不是 复制 元素,则可以将 removeChildappendChild 一起使用,这将保留事件侦听器。例如:

 function relocateElementBySelector(elementSelector, destSelector) {
  let element = document.querySelector(elementSelector);
  let elementParent = element.parentElement;
  let destElement = document.querySelector(destSelector);
  elementParent.removeChild(element);
  destElement.appendChild(element);
}

原文由 Richard Greenwood 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏