cloneNode() 是原生 JavaScript 复制 DOM 节点的方法,浅拷贝(false 或省略)仅复制节点自身及属性,深拷贝(true)递归复制整个子树,但均不复制事件监听器、表单当前值及自定义 JS 属性。

cloneNode() 是原生 JavaScript 中复制 DOM 节点最直接的方法,它不依赖外部库,语法简洁,但行为有明确边界——只克隆结构与属性,不复制事件监听器或表单当前值。
浅拷贝:只复制节点本身
调用 cloneNode() 不传参数,或显式传 false,就执行浅拷贝:
- 仅创建目标节点的副本(如一个
<div> 标签) <li>不复制任何子节点、文本内容或子元素树</li> <li>保留所有 HTML 属性(<code>id、class、data-*等) - 若原节点有
id,克隆后需手动修改,避免文档中 ID 重复 - 递归复制目标节点 + 所有后代节点(包括元素、文本节点、注释等)
- 完整保留嵌套结构、HTML 属性、文本内容
- 仍不复制:
addEventListener绑定的事件、input.value当前输入值、checked状态、自定义 JS 属性(如node.myData) - 默认行为是浅拷贝(
cloneNode()等价于cloneNode(false)),不是深拷贝 —— 这和早期规范不同,现行标准以false为默认值 - 克隆后必须手动
appendChild()、insertBefore()等方法把副本插入 DOM,否则它只是内存中的游离节点 - 若需让克隆节点具备相同交互逻辑,不能靠克隆事件,而应:用事件委托统一监听;或封装初始化函数,在克隆后立即调用(如
initButton(clone)) - 避免 ID 冲突:深拷贝含
id的节点后,建议重设clone.id = 'new-id'
深拷贝:复制节点及其全部子树
传入 true 参数即可深度克隆:
常见注意事项和实用建议
实际使用时,这几个点容易踩坑:


















