返回值:jQueryclone([withDataAndEvents])
对匹配的元素进行深层拷贝。
-
1.0 新增clone([withDataAndEvents])
withDataAndEvents (Boolean) 可选参数,默认值:'false'布尔值,表示是否也拷贝元素上的事件。从 jQuery 1.4 开始,同样也会拷贝元素上的数据。 -
1.5 新增clone([withDataAndEvents], [deepWithDataAndEvents])
withDataAndEvents (Boolean) 可选参数,默认值:'false'布尔值,表示是否也拷贝元素上的事件和数据。默认值是false
。* 在 jQuery 1.5.0 中,该默认值被设置成了true
,但这样做似乎并不太合适。所以从 1.5.1 开始,该默认值恢复成了false
。deepWithDataAndEvents (Boolean) 可选参数,默认值:'value of withDataAndEvents'布尔值,表示是否也拷贝元素及该元素上所有子元素的事件和数据。默认情况下,该值与withDataAndEvents
参数的值是一样的。(也就是说,默认值是false
)。
.clone()
方法会对匹配的元素进行深拷贝。也就是说,该方法会拷贝匹配元素以及匹配元素的所有后代元素及文本节点。当 .clone()
方法与插入类相关的方法一起使用时,可以很方便的创建页面元素的复本。例如,有如下 HTML:
<div class="container"> <div class="hello">Hello</div> <div class="goodbye">Goodbye</div> </div>
插入类相关的方法,在这里我们选择
.append()
。通常情况下,将某元素插入到 DOM 的某处时,意味着是将该元素从原来的位置移动到待插入位置。因此,如果执行完下面的代码:
$('.hello').appendTo('.goodbye');
我们会得到如下的 DOM 结构:
<div class="container"> <div class="goodbye"> Goodbye <div class="hello">Hello</div> </div> </div>
为了防止这种现象发生,我们可以先对待插入元素进行深拷贝,然后再进行插入操作。所以我们可以按下面这样做:
$('.hello').clone().appendTo('.goodbye');
得到的结果如下:
<div class="container"> <div class="hello">Hello</div> <div class="goodbye"> Goodbye <div class="hello">Hello</div> </div> </div>
注意: 当使用
.clone()
方法时,在向文档中插入或再插入之前,你可以修改克隆后的元素或者是其内容。
通常情况下,不会对绑定在匹配元素上的任何事件进行深拷贝。withDataAndEvents
参数允许我们改变这种默认行为,从而可以对事件进行拷贝,并将其绑定到新生成的对象上。从 jQuery 1.4 开始,所有的元素数据(通过 .data()
方法添加的),也会被拷贝到新生成的对象上。
但是,如果元素数据中包含对象和数组的话,这些数据是不会被拷贝的。对于被克隆的元素以及克隆生成的新元素而言,这些数据依然是被共享的。如果同样要对这些数据进行深拷贝的话,请手动一个一个的进行拷贝,例如:
var $elem = $('#elem').data( "arr": [ 1 ] ), // Original element with attached data $clone = $elem.clone( true ) .data( "arr", $.extend( [], $elem.data("arr") ) ); // Deep copy to prevent data sharing
从 jQuery 1.5 开始,使用 withDataAndEvents
参数时,也可以使用增强的 deepWithDataAndEvents
参数,实现对所有子元素的事件和数据的拷贝。
注意: 在使用
.clone()
生成含有id
属性元素的副本时会有副作用,因为该元素本应该是唯一的元素。所以,应该尽可能的避免克隆含有id
属性的元素或者使用class
属性作为标识符进行替代。
示例:
克隆所有的 b 元素 (并且选中这些克隆元素),并将它们添加到段落标签内的起始位置。
<!DOCTYPE html>
<html>
<head>
<script src="jquery.min.js"></script>
</head>
<body>
<b>Hello</b><p>, how are you?</p>
<script>
$("b").clone().prependTo("p");
</script>
</body>
</html>
演示:
示例:
当使用 .clone() 克隆一组元素,并且这些克隆生成的元素尚未被添加到 DOM 中,那么当这些元素被插入到 DOM 中时,不能保证是按它们的原顺序被插入的。但是,可以像下面例子中提到的那样,保证顺序的正确性:
<!DOCTYPE html>
<html>
<head>
<style>
#orig, #copy, #copy-correct {
float: left;
width: 20%;
}
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<div id="orig">
<div class="elem"><a>1</a></div>
<div class="elem"><a>2</a></div>
<div class="elem"><a>3</a></div>
<div class="elem"><a>4</a></div>
<div class="elem"><a>5</a></div>
</div>
<div id="copy"></div>
<div id="copy-correct"></div>
<script>
// sort order is not guaranteed here and may vary with browser
$('#copy').append($('#orig .elem')
.clone()
.children('a')
.prepend('foo - ')
.parent()
.clone());
// correct way to approach where order is maintained
$('#copy-correct')
.append($('#orig .elem')
.clone()
.children('a')
.prepend('bar - ')
.end());
</script>
</body>
</html>