jQuery clone () non clona le associazioni di eventi, anche con on ()


100

Ho creato una serie di eventi jQuery personalizzati da utilizzare nelle applicazioni web mobili. Funzionano alla grande e sono stati testati. Tuttavia, ho riscontrato un piccolo problema che ho difficoltà a capire.

Sto utilizzando .clone()alcuni elementi all'interno del DOM, che contengono un pulsante. Il pulsante ha alcuni degli eventi personalizzati ad esso associati (gli eventi sono associati usando .on()), ma. Sfortunatamente, quando uso jQuery .clone(), i collegamenti non vengono preservati e devo aggiungerli di nuovo.

Qualcuno lo ha mai incontrato prima, qualcuno sa di una potenziale soluzione? Pensavo che l'uso .on()avrebbe dovuto preservare il legame per elementi che esistono ora o in futuro?


"Pensavo che l'uso di .on () avrebbe dovuto preservare l'associazione per gli elementi che esistono ora o in futuro?" - Questo ha poco a che fare con .clone; è la logica di delega degli eventi di jQuery e funziona se si passa un selettore aggiuntivo a .on.
pimvdb

Risposte:


213

Penso che dovresti usare questo sovraccarico del metodo .clone () :

$element.clone(true, true);

clone ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : un valore booleano che indica se i gestori di eventi e i dati devono essere copiati insieme agli elementi. Il valore predefinito è falso.

deepWithDataAndEvents : un valore booleano che indica se devono essere copiati i gestori di eventi e i dati per tutti i figli dell'elemento clonato. Per impostazione predefinita, il suo valore corrisponde al valore del primo argomento (che per impostazione predefinita è false).


Attenzione che in .on()realtà non lega gli eventi ai target ma all'elemento a cui stai delegando. Quindi se hai:

$('#container').on('click', '.button', ...);

Gli eventi sono effettivamente legati a #container. Quando si verifica un clic su un .buttonelemento, esso bolle fino #containerall'elemento. L'elemento che ha attivato l'evento viene valutato sul parametro del selettore di .on()e, se corrisponde, viene eseguito il gestore di eventi. Ecco come funziona la delega degli eventi.

Se cloni l'elemento #container, devi clonare in profondità con eventi e dati per .on()preservare i collegamenti effettuati .

Questo non sarebbe necessario se lo stessi usando .on()su un genitore di #container.


20
Non ho mai saputo .clone()argomenti accettati. FML. Grazie per l'aiuto.
BenM

1
@DidierGhys Grazie, ho lottato per .clone()non clonare .data()(sia i data-xxxx="somedata"dati nel DOM) .. Anche questo risolve il problema!
Richard de Wit

Ho posto questa domanda , ma nessuno mi ha risposto. Mi potete aiutare?
Ali Soltani

Eccellente, ho dovuto creare un clickevento per aggiungere il nuovo div clonato. readynon funzionava
csandreas1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.