jQuery的clone陷阱
前言
clone()
方法生成被选元素的副本,包含子节点、文本和属性。
这里的属性, 包括了 id
。当clone
了id
后, 获取id
将会获取第一个匹配id
的元素。造成不可预期的后果。
例子
1 | <div> |
分析
这是一个简单的页面, 每点击一次按钮, 就会更新div-source
的时间, 再复制到div-clone
中。
当第一次点击时, 页面如下, div-clone
复制成功。
- 更新
id
为time
的元素文本为 现在的时间 - 复制
id
为time
的元素文本 - 粘贴到
div-clone
里面问题出在第二次点击时, 只会更新第一个1
2
3
4
5
6
7
8
9
10<div>
<button id="btn">复制时间到第一个div中</button>
<div class="div-clone">
<p id="time">时间:Wed Mar 14 2018 14:53:15 GMT+0800 (中国标准时间)</p>
</div>
<hr>
<div class="div-source">
<p id="time">时间:Wed Mar 14 2018 14:53:15 GMT+0800 (中国标准时间)</p>
</div>
</div>div
, 不更新第二个div
- 更新
div-clone
下的id
为time
的元素文本为 现在的时间, 因为现在id
为time
的元素有两个。会更新第一个元素,也就是div-clone
下的id
为time
的元素 - 复制
div-clone
下的id
为time
的元素文本 - 粘贴到
div-clone
里面 div-source
没被操作1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<div>
<button id="btn">复制时间到第一个div中</button>
<div class="div-clone">
// 注意这里!!!有两个id为time的元素
<p id="time">时间:Wed Mar 14 2018 15:01:05 GMT+0800 (中国标准时间)</p>
</div>
<hr>
<div class="div-source">
// 注意这里!!!有两个id为time的元素
<p id="time">时间:Wed Mar 14 2018 14:53:15 GMT+0800 (中国标准时间)</p>
</div>
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
$('#btn').click(function(){
// 第二次点击, 预期是更新 div-source 的时间, 实际会更新 div-clone 中的时间
var $time = $('#time');
$time.html('时间:'+new Date());
var $clone = $time.clone();
$('.div-clone').html($clone);
});
</script>
总结
clone
最好不要复制带有id
属性的元素, 否则会发生不可预期的错误。