genel bakış
Aşağıdaki HTML yapısı var ve öğeye dragenter
ve dragleave
olayları <div id="dropzone">
ekledim.
<div id="dropzone">
<div id="dropzone-content">
<div id="drag-n-drop">
<div class="text">this is some text</div>
<div class="text">this is a container with text and images</div>
</div>
</div>
</div>
Sorun
Bir dosyayı üzerine sürüklediğimde <div id="dropzone">
, dragenter
olay beklendiği gibi tetiklenir. Ancak, faremi bir öğe üzerinde gezdirdiğimde, öğe <div id="drag-n-drop">
için dragenter
olay tetiklenir <div id="drag-n-drop">
ve sonra öğe için dragleave
olay tetiklenir <div id="dropzone">
.
<div id="dropzone">
Tekrar öğenin üzerine gelirseniz , dragenter
olay tekrar tetiklenir, bu da serindir, ancak daha sonra dragleave
olay, alt öğe için bırakılır, bu nedenle removeClass
talimat, yürütülür, bu da serin değildir.
Bu davranış 2 nedenden dolayı sorunludur:
Sadece ekliyorum
dragenter
vedragleave
bu<div id="dropzone">
yüzden çocuk öğelerinin neden bu olaylara bağlı olduğunu anlamıyorum.Hala
<div id="dropzone">
çocuklarının üzerine gelirken elemanın üzerine sürüklüyorum, bu yüzdendragleave
ateş etmek istemiyorum !
jsFiddle
İşte şaka yapmak için bir jsFiddle: http://jsfiddle.net/yYF3S/2/
Soru
Öyleyse ... bir <div id="dropzone">
öğeyi öğenin dragleave
üzerine sürüklediğimde, herhangi bir alt öğenin üzerine sürüklesem bile ateşlemeyecek şekilde nasıl yapabilirim ... sadece <div id="dropzone">
öğeyi terk ettiğimde ateşlenmelidir .. . gezinip / elemanın sınırları içinde herhangi bir yerde etrafında sürükleyerek olmamalı tetikleyecek dragleave
olayı.
En azından HTML5 sürükle-bırak özelliğini destekleyen tarayıcılarda çapraz tarayıcı uyumlu olması gerekiyor, bu yüzden bu cevap yeterli değil.
Google ve Dropbox bunu çözmüş gibi görünüyor, ancak kaynak kodları küçültülmüş / karmaşık olduğundan, uygulamalarından anlayamadım.
e.stopPropagation();