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
|
|
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
|
|
Pour éviter cela et créer plutôt une copie de l’élément, vous pourriez écrire ce qui suit :
1
|
|
Ceci produirait :
1
2
3
4
5
6
7
|
|
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
|
|
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.