.clone()| jqueryAPI 2.2 中文手册- AspRain.cn 致力于Web开发技术翻译整理

jQuery API 2.2.0

.clone()

分类:操纵 > 复制

返回: jQuery

.clone( [withDataAndEvents ] )

描述:给匹配的元素集合创建一个深复制副本。

加入于: 1.0
.clone( [withDataAndEvents ] )
  • withDataAndEvents (默认值:false)
    类型:Boolean
    一个布尔值,标识了事件处理函数是否陪着元素一起复制。自从jQuery 1.4,元素数据将一起复制。
加入于: 1.5
.clone( [withDataAndEvents ] [, deepWithDataAndEvents ] )
  • withDataAndEvents (默认值:false)
    类型:Boolean
    一个布尔值,标识了事件处理函数是否陪着元素一起复制。它的默认值是false自从jQuery 1.5,该默认值被修正为true,在jQuery 1.5.1及以后的版本中,又变回false
  • deepWithDataAndEvents (默认值:value of withDataAndEvents)
    类型:Boolean
    一个布尔值,表示着克隆元素的所有子元素上的事件处理函数和数据是否也必须复制。它的默认值匹配它的第一个参数(第一个参数的默认值是false)。

.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>

演示结果

如果网页上不能运行示例,请点击http://www.asprain.cn/jQueryAPI/clone.htm查看示例。

如果你觉得本文档对你有用,欢迎给翻译作者支付宝打赏,支持翻译作者源源不断翻译更多有用的技术文档。