2012-04-24 15 views
5

Bazı çocukları içeren bir nesneye dragenter olayım bağlı. jQuery dragenter olayı her çocuğa işlenir

$(document).on('dragenter', '#container', function(e) { 
    console.log('dragenter'); 
}); 

Ben çevrelerindeki sürüklenen dosya ile hareket

, bu olay defalarca ateş ediyor. Beklediğim şey sadece #container elemanını girerken, her çocuğa değil dragenter'u ateşlemektir.

Doğru davranış mı? Bunu nasıl önleyebilirim?

cevap

12

Sen olayı tetikleyen unsur konteyner olup olmadığını test edebilirsiniz stopPropagation eklemek için:

:

var container = $('#container').get(0); 

$(document).on('dragenter', '#container', function(event) { 
    if(event.target === container) { 
     console.log('dragenter'); 
    } 
}); 

Yoksa olay heyeti kullanmak yoksa

$('#container').on('dragenter', function(event) { 
    if(event.target === this) { 
     console.log('dragenter'); 
    } 
}); 
+1

Ne yazık ki' konteyner 'çocuklarıyla tam olarak kaplandığında bu test her zaman başarısız olur. Çocukları 'dragend' ile bağlama - mümkün değil' sadece 'konteyner? – hsz

+0

Tamam, cevabınızı kullanarak bundan kurtuldum. Bununla birlikte, bir olayla sadece ebeveynleri bağlamayı merak ediyorum. ;-) Teşekkür ederim! – hsz

+0

sorununuz, https://bugs.webkit.org/show_bug.cgi?id=66547 ile ilgili olabilir. –

0

deneyin

$(document).on('dragenter', '#container', function(e) { 
    e.stopPropagation(); 
    console.log('dragenter'); 
}); 
+0

$ ('# container') yerine $ (document) –

+0

yerine seçici olarak kullanıyorum. – hsz

+0

dokümantasyonunda, etkinliğin '#container' dan $ (document) selektörüne kadar giderildiğini belirtir. Sizin durumunuzda, beklenen davranış gerçekden farklıdır ve kendinizi filtrelemeniz gerekir (görebildiğim kadarıyla) (bkz. Felix 'cevabı) –

0

Bu soruya cevabım, ev yerine event capturing kullanmaktır. kabarcıklanma. Özetle, dış öğeden kaynak öğeye veya e.stopPropagation() numaralı duruma kadar "damlatılır" yakalama olayı bir olayda çağrılır.

Olay köpüren olayları, kaynak öğeden ana belgeye kadar belgeye ulaşana kadar kabarcıkları veya e.stopPropagation() ile durdurulur.

Bu nedenle, sürükleme girişine uygulamak için, aslında olayı oluşturan iç div olsa bile, dış divun olayı ele almasını istersiniz.

Olay yakalamayı kullanmak, iç divtan önce Outer Div'da ondergenter yangını yapar. Outter div olay işleyicisinde, e.stopPropagation'ı çağırırsınız. Yani iç div olay işleyicisi aslında hiç çalışmaz.

$("#outerDiv").get(0).addEventListener("ondragenter", function(e){e.stopPropagation()}, true); 

Not son parametre:

This olayı yakalamak için jquery kullanmak nasıl.