jQuery clone () tidak mengkloning event binding, bahkan dengan on ()

100

Saya telah membuat serangkaian acara jQuery khusus untuk digunakan dalam aplikasi web seluler. Mereka bekerja dengan baik dan telah diuji. Namun, saya mengalami masalah kecil yang sulit saya pahami.

Saya menggunakan .clone()beberapa elemen dalam DOM, yang berisi tombol. Tombol tersebut memiliki beberapa kejadian khusus yang terikat padanya (kejadian terikat menggunakan .on()), tetapi. Sayangnya, saat saya menggunakan jQuery .clone(), binding tidak dipertahankan, dan saya harus menambahkannya lagi.

Adakah yang pernah mengalami hal ini sebelumnya, apakah seseorang mengetahui potensi yang ada? Saya pikir penggunaan .on()itu seharusnya untuk menjaga pengikatan elemen yang ada sekarang, atau di masa depan?

BenM
sumber
"Saya pikir menggunakan .on () seharusnya menjaga pengikatan untuk elemen yang ada sekarang, atau di masa depan?" - Ini tidak ada hubungannya dengan .clone; itu adalah logika delegasi acara jQuery dan berfungsi jika Anda meneruskan pemilih tambahan ke .on.
pimvdb

Jawaban:

213

Saya pikir Anda harus menggunakan kelebihan metode .clone () ini:

$element.clone(true, true);

klon ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : Boolean yang menunjukkan apakah penangan peristiwa dan data harus disalin bersama dengan elemen. Nilai defaultnya salah.

deepWithDataAndEvents : Boolean yang menunjukkan apakah penangan peristiwa dan data untuk semua turunan dari elemen yang digandakan harus disalin. Secara default nilainya cocok dengan nilai argumen pertama (yang defaultnya salah).


Berhati-hatilah karena .on()tidak benar-benar mengikat acara ke target tetapi ke elemen yang Anda delegasikan. Jadi jika Anda memiliki:

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

Peristiwa sebenarnya terikat #container. Ketika sebuah klik pada .buttonelemen terjadi, itu menggelembung ke #containerelemen Elemen yang memicu kejadian dievaluasi berdasarkan parameter pemilih .on()dan jika cocok, pengendali kejadian dijalankan. Ini adalah cara kerja delegasi acara.

Jika Anda menggandakan elemen #container, Anda harus melakukan kloning mendalam dengan peristiwa dan data agar binding dibuat .on()agar dapat dipertahankan.

Ini tidak diperlukan jika Anda menggunakan .on()di induk dari #container.

Didier Ghys
sumber
20
Tidak pernah tahu .clone()argumen yang diterima. FML. Terima kasih atas bantuan Anda.
BenM
1
@DidierGhys Terima kasih, saya telah berjuang untuk .clone()tidak mengkloning .data()(keduanya data-xxxx="somedata"dan data di DOM) .. Ini juga memperbaikinya!
Richard de Wit
Saya mengajukan pertanyaan ini , tetapi tidak ada yang menjawab saya. Bisakah kamu membantuku?
Ali Soltani
Luar biasa, saya harus membuat clickacara untuk menambahkan div kloning baru. readytidak bekerja
csandreas1
4

Anda harus menyadari fakta bahwa fungsionalitas kloning yang dalam telah ditambahkan ke versi 1.5 jQuery.

Info lebih lanjut tentang topik ini:

http://api.jquery.com/clone/

Giedrius Vičkus
sumber