.clone()
.clone( [withDataAndEvents ] )
描述:给匹配的元素集合创建一个深复制副本。
- withDataAndEvents (默认值:
false
)类型:Boolean一个布尔值,标识了事件处理函数是否陪着元素一起复制。自从jQuery 1.4,元素数据将一起复制。
.clone()
方法实施了对匹配元素的集合的深复制,意味着它复制了匹配元素的副本以及它们的后代元素以及文本节点。
注意:出于性能原因,某些表单元素的动态状态(例如,键入到<textarea>中的用户数据,以及用户对<select>所作的选择)不会复制到克隆的元素中。在克隆input
元素时,元素的动态状态(例如,键入到<textarea>中的用户数据,以及用户对<select>所作的选择)保留在克隆的元素内。
在与一个插入方法并用的时候,.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 ] ), $clone = $elem.clone( true ) // Deep copy to prevent data sharing .data( "arr", $.extend( [], $elem.data( "arr" ) ) );
自从jQuery 1.5,withDataAndEvents
可以视情况用deepWithDataAndEvents
加强,以针对克隆元素所有子元素复制事件和数据。
注意:使用.clone()
具有一个副作用,是制作元素上带了它的元素属性id,而它本应该是独一无二的。如果有可能发生这种事,建议避免克隆带这个元素属性的元素,或者改而使用元素属性class
作为识别器。
示例
克隆所有的<b>元素(并且选中这些克隆节点),把它们插入到所有段落文本的前面。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>clone demo</title> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <b>Hello</b><p>, how are you?</p> <script> $( "b" ).clone().prependTo( "p" ); </script> </body> </html>
演示结果