You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jQuery .clone()复制元素后复用异常,求保留状态的解决办法

问题与解决方案

问题场景

尝试复用包含复选框的元素,使用jQuery的.clone()方法时出现异常:修改.test1内的复选框状态后,克隆的元素仅会保留在#test3中,#test2里的元素会被移除。

代码示例

JavaScript

$('.test1').on('change', ':input', function() {
  $temp = $(".test1").clone()[0];
  $('#test2').html($temp);
  $('#test3').html($temp);
});

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div class="test1">
  <input type="checkbox" checked> a<br/>
  <input type="checkbox" checked> b<br/>
</div>

<div>Test 2</div>
<div id="test2"></div>

<div>Test 3</div>
<div id="test3"></div>

问题原因

同一个DOM节点无法同时存在于DOM树的两个不同位置。你只克隆了一份DOM元素,当第二次调用.html($temp)时,这个节点会从#test2的位置被移动到#test3,导致#test2为空。


解决办法

需要为#test2和#test3分别提供独立的克隆副本,有两种实现方式:

方式1:每次插入时单独克隆

直接为每个目标容器克隆一份元素,确保它们是独立的DOM节点:

$('.test1').on('change', ':input', function() {
  $('#test2').html($(".test1").clone());
  $('#test3').html($(".test1").clone());
});

方式2:提前克隆两份副本

先克隆出两个独立的副本,再分别插入到目标容器:

$('.test1').on('change', ':input', function() {
  const $cloneForTest2 = $(".test1").clone();
  const $cloneForTest3 = $(".test1").clone();
  $('#test2').html($cloneForTest2);
  $('#test3').html($cloneForTest3);
});

关于状态保留

jQuery的.clone()方法默认会复制元素的属性和当前状态(包括复选框的checked状态),所以上述两种方法都能完整保留.test1内复选框的修改状态。如果需要同时复制元素绑定的事件,可以给.clone()传入true参数(即$(".test1").clone(true)),你的场景中无需此操作,默认即可满足需求。


内容的提问来源于stack exchange,提问作者Robbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 08:40:41