Articles

.clone()

Posted on

La méthode .clone() effectue une copie profonde de l’ensemble des éléments appariés, ce qui signifie qu’elle copie les éléments appariés ainsi que tous leurs éléments et nœuds de texte descendants.

Note : Pour des raisons de performance, l’état dynamique de certains éléments de formulaire (par ex, les données de l’utilisateur saisies dans textarea et les sélections de l’utilisateur effectuées dans une select) n’est pas copié dans les éléments clonés. Lors du clonage des éléments input, l’état dynamique de l’élément (par exemple, les données de l’utilisateur saisies dans les entrées de texte et les sélections de l’utilisateur effectuées sur une case à cocher) est conservé dans les éléments clonés.

Lorsqu’il est utilisé conjointement avec l’une des méthodes d’insertion, .clone() est un moyen pratique de dupliquer des éléments sur une page. Considérez le HTML suivant :

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

Comme le montre la discussion sur .append(), normalement, lorsqu’un élément est inséré quelque part dans le DOM, il est déplacé de son ancien emplacement. Donc, étant donné le code :

.

1

.

La structure DOM résultante serait :

.

1
2
3
4
5

..

6
<div class="container">
<div class="goodbye">
Goodbye
<div class="hello">Hello</div>
</div>
</div>

Pour éviter cela et créer plutôt une copie de l’élément, vous pourriez écrire ce qui suit :

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

Ceci produirait :

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>

Note : Lorsque vous utilisez la méthode .clone(), vous pouvez modifier les éléments clonés ou leur contenu avant de les (ré)insérer dans le document.

Normalement, les éventuels gestionnaires d’événements liés à l’élément original ne sont pas copiés sur le clone. Le paramètre optionnel withDataAndEvents nous permet de modifier ce comportement, et de faire plutôt des copies de tous les gestionnaires d’événements également, liés à la nouvelle copie de l’élément. À partir de jQuery 1.4, toutes les données de l’élément (attachées par la méthode .data()) sont également copiées sur la nouvelle copie.

Toutefois, les objets et les tableaux au sein des données de l’élément ne sont pas copiés et continueront à être partagés entre l’élément cloné et l’élément d’origine. Pour copier en profondeur toutes les données, copiez chacune d’entre elles manuellement :

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

A compter de jQuery 1.5, withDataAndEvents peut être éventuellement enrichi de deepWithDataAndEvents pour copier les événements et les données de tous les enfants de l’élément cloné.

Note : L’utilisation de .clone() a pour effet secondaire de produire des éléments avec des attributs id dupliqués, qui sont censés être uniques. Dans la mesure du possible, il est recommandé d’éviter de cloner des éléments avec cet attribut ou d’utiliser plutôt les attributs class comme identifiants.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *