genel bakış
Aşağıdaki HTML yapısı var ve öğeye dragenterve dragleaveolayları <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">, dragenterolay beklendiği gibi tetiklenir. Ancak, faremi bir öğe üzerinde gezdirdiğimde, öğe <div id="drag-n-drop">için dragenterolay tetiklenir <div id="drag-n-drop">ve sonra öğe için dragleaveolay tetiklenir <div id="dropzone">.
<div id="dropzone">Tekrar öğenin üzerine gelirseniz , dragenterolay tekrar tetiklenir, bu da serindir, ancak daha sonra dragleaveolay, alt öğe için bırakılır, bu nedenle removeClasstalimat, yürütülür, bu da serin değildir.
Bu davranış 2 nedenden dolayı sorunludur:
Sadece ekliyorum
dragentervedragleavebu<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üzdendragleaveateş 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 dragleaveolayı.
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();