jQuery clone (), on () ile bile olay bağlamalarını klonlamıyor


100

Mobil web uygulamalarında kullanılmak üzere bir dizi özel jQuery etkinliği oluşturdum. Harika çalışıyorlar ve test edildi. Ancak, anlamakta güçlük çektiğim küçük bir sorunla karşılaştım.

.clone()DOM içinde bir düğme içeren birkaç öğe kullanıyorum . Düğme, kendisine bağlı bazı özel olaylara sahiptir (olaylar kullanılarak bağlanır .on()), ancak. Ne yazık ki, jQuery'leri kullandığımda .clone(), bağlamalar korunmuyor ve onları yeniden eklemem gerekiyor.

Bununla daha önce karşılaşan oldu mu, birisi potansiyel bir işten haberdar mı? Kullanmanın .on()şimdi veya gelecekte var olan öğeler için bağlayıcılığı koruması gerektiğini düşündüm.


".On () kullanmanın şimdi veya gelecekte var olan öğeler için bağlayıcılığı korumasının beklendiğini düşündüm." - Bunun çok az ilgisi var .clone; jQuery'nin olay delegasyon mantığıdır ve ek bir seçici iletirseniz çalışır .on.
pimvdb

Yanıtlar:


213

.Clone () yönteminin bu aşırı yüklemesini kullanmanız gerektiğini düşünüyorum :

$element.clone(true, true);

klon ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents : Olay işleyicilerinin ve verilerin öğelerle birlikte kopyalanması gerekip gerekmediğini belirten bir Boole. Varsayılan değer yanlıştır.

deepWithDataAndEvents : Klonlanan öğenin tüm alt öğeleri için olay işleyicilerinin ve verilerinin kopyalanması gerekip gerekmediğini gösteren bir Boole. Varsayılan olarak değeri, ilk bağımsız değişkenin değeriyle eşleşir (varsayılan olarak yanlıştır).


Dikkat edin, bu .on()aslında bağlamak hedeflere ancak hiç yetkilendirirken elemana olaylar yok. Yani eğer varsa:

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

Olaylar gerçekte bağlanmıştır #container. Bir .buttonöğeye tıklama gerçekleştiğinde, öğeye doğru kabarcıklar #containerEtkinliği tetikleyen öğe , öğenin seçici parametresine göre değerlendirilir..on() olay işleyicisi çalıştırılır. Olay delegasyonu böyle çalışır.

# Container öğesini klonlarsanız, .on()korunması için yapılan bağlamalar için olaylar ve verilerle derin klonlamanız gerekir.

.on()Bir ebeveyni üzerinde kullanıyor olsaydınız bu gerekli olmazdı #container.


20
.clone()Kabul edilen argümanları asla bilmiyordum . FML. Yardımınız için teşekkürler.
BenM

1
@DidierGhys Teşekkürler, (hem DOM’daki verileri hem de) .clone()klonlamamakla uğraşıyorum .. Bu da onu düzeltir! .data()data-xxxx="somedata"
Richard de Wit

Bunu sordum soru , ama kimse beni cevap verdi. Bana yardım eder misiniz?
Ali Soltani

Mükemmel, clickyeni klonlanmış div'i eklemek için bir etkinlik yapmam gerekiyordu. readyçalışmıyordu
csandreas1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.