Il metodo .clone()
esegue una copia profonda dell’insieme degli elementi abbinati, cioè copia gli elementi abbinati così come tutti i loro elementi discendenti e i nodi di testo.
Nota: Per ragioni di prestazioni, lo stato dinamico di alcuni elementi del modulo (es, i dati utente digitati in textarea
e le selezioni dell’utente effettuate in un select
) non vengono copiati negli elementi clonati. Quando si clonano gli elementi input
, lo stato dinamico dell’elemento (ad esempio, i dati inseriti dall’utente negli input di testo e le selezioni effettuate dall’utente in una casella di controllo) viene mantenuto negli elementi clonati.
Quando viene usato insieme ad uno dei metodi di inserimento, .clone()
è un modo conveniente per duplicare elementi in una pagina. Considerate il seguente HTML:
1
2
3
4
|
|
Come mostrato nella discussione per .append()
, normalmente quando un elemento viene inserito da qualche parte nel DOM, viene spostato dalla sua vecchia posizione. Quindi, dato il codice
1
|
|
La struttura DOM risultante sarebbe:
1
2
3
4
5
6
|
|
Per evitare questo e creare invece una copia dell’elemento, si potrebbe scrivere quanto segue:
1
|
|
Questo produrrebbe:
1
2
3
4
5
6
7
|
|
Nota: Quando si usa il metodo .clone()
, è possibile modificare gli elementi clonati o il loro contenuto prima di (ri)inserirli nel documento.
Normalmente, qualsiasi gestore di eventi legato all’elemento originale non viene copiato nel clone. Il parametro opzionale withDataAndEvents
ci permette di cambiare questo comportamento, e di fare invece delle copie di tutti i gestori di eventi legati alla nuova copia dell’elemento. A partire da jQuery 1.4, tutti i dati dell’elemento (allegati dal metodo .data()
) sono anche copiati nella nuova copia.
Tuttavia, gli oggetti e gli array all’interno dei dati dell’elemento non vengono copiati e continueranno ad essere condivisi tra l’elemento clonato e l’elemento originale. Per copiare in profondità tutti i dati, copiate ciascuno manualmente:
1
2
3
4
5
|
|
A partire da jQuery 1.5, withDataAndEvents
può essere opzionalmente arricchito con deepWithDataAndEvents
per copiare gli eventi e i dati per tutti i figli dell’elemento clonato.
Nota: Usare .clone()
ha l’effetto collaterale di produrre elementi con attributi id
duplicati, che dovrebbero essere unici. Dove possibile, si raccomanda di evitare di clonare elementi con questo attributo o di usare invece gli attributi class
come identificatori.