Articles

.clone()

Posted on

O método .clone() realiza uma cópia profunda do conjunto de elementos combinados, o que significa que copia os elementos combinados bem como todos os seus elementos descendentes e nós de texto.

Nota: Por razões de desempenho, o estado dinâmico de certos elementos da forma (por exemplo dados do utilizador digitados em textarea e as selecções do utilizador feitas em select) não são copiados para os elementos clonados. Ao clonar input elementos, o estado dinâmico do elemento (por exemplo, dados do utilizador digitados em entradas de texto e selecções do utilizador efectuadas numa caixa de verificação) é retido nos elementos clonados.

Quando utilizado em conjunto com um dos métodos de inserção, .clone() é uma forma conveniente de duplicar elementos numa página. Considere o seguinte HTML:

1
2
3
4
<div class="container">
<div class="hello">Hello</div>
<div class="goodbye">Goodbye</div>
</div>

Como mostrado na discussão para .append(), normalmente quando um elemento é inserido algures no DOM, ele é deslocado do seu antigo local. Assim, dado o código:

1
$( ".hello" ).appendTo( ".goodbye" );

A estrutura DOM resultante seria

1
2
3
4
5
6
<div class="container">
<div class="goodbye">
Goodbye
<div class="hello">Hello</div>
</div>
</div>

Para evitar isto e em vez disso criar uma cópia do elemento, poderia escrever o seguinte:

1
$( ".hello" ).clone().appendTo( ".goodbye" );

Esta produziria:

1
2
3
4
5
6
7
<div class="container">
<div class="hello">Hello</div>
<div class="goodbye">
Goodbye
<div class="hello">Hello</div>
</div>
</div>

Nota: Ao utilizar o método .clone(), pode modificar os elementos clonados ou o seu conteúdo antes de os (re)inserir no documento.

Normalmente, quaisquer manipuladores de eventos ligados ao elemento original não são copiados para o clone. O parâmetro opcional withDataAndEvents permite-nos alterar este comportamento, e em vez disso fazer cópias de todos os manipuladores de eventos também, vinculados à nova cópia do elemento. A partir de jQuery 1.4, todos os dados do elemento (anexados pelo parâmetro .data()) são também copiados para a nova cópia.

No entanto, os objectos e matrizes dentro dos dados do elemento não são copiados e continuarão a ser partilhados entre o elemento clonado e o elemento original. Para copiar em profundidade todos os dados, copie cada um manualmente:

1
2
3
4
5
// Original element with attached data
var $elem = $( "#elem" ).data( "arr", ),
$clone = $elem.clone( true )
// Deep copy to prevent data sharing

As de jQuery 1.5, withDataAndEvents pode ser opcionalmente melhorado com deepWithDataAndEvents para copiar os eventos e dados para todas as crianças do elemento clonado.

Nota: Usando .clone() tem o efeito secundário de produzir elementos com duplicado id atributos, que supostamente são únicos. Sempre que possível, recomenda-se evitar clonar elementos com este atributo ou utilizar class atributos como identificadores.

atributos como identificadores

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *