Gambaran
Saya memiliki struktur HTML berikut dan saya telah melampirkan dragenter
dan dragleave
acara ke <div id="dropzone">
elemen.
<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>
Masalah
Ketika saya menyeret file ke atas <div id="dropzone">
, dragenter
acara tersebut diaktifkan seperti yang diharapkan. Namun, ketika saya memindahkan mouse saya ke elemen anak, seperti <div id="drag-n-drop">
, dragenter
acara dipecat untuk <div id="drag-n-drop">
elemen dan kemudian dragleave
acara dipecat untuk<div id="dropzone">
elemen.
Jika saya mengarahkan <div id="dropzone">
elemen lagi, dragenter
acara kembali dipecat, yang keren, tapi kemudian dragleave
acara dipecat untuk elemen anak yang baru saja pergi, jadiremoveClass
instruksi dijalankan, yang tidak keren.
Perilaku ini bermasalah karena 2 alasan:
Saya hanya melampirkan
dragenter
&dragleave
ke<div id="dropzone">
jadi saya tidak mengerti mengapa elemen anak-anak memiliki acara ini juga terpasang.Saya masih menyeret
<div id="dropzone">
elemen sambil melayang-layang di atas anak-anaknya jadi saya tidak ingindragleave
menembak!
jsFiddle
Berikut adalah jsFiddle untuk bermain-main dengan: http://jsfiddle.net/yYF3S/2/
Pertanyaan
Jadi ... bagaimana saya bisa membuatnya sehingga ketika saya menyeret file di atas <div id="dropzone">
elemen, dragleave
tidak memecat bahkan jika saya menyeret elemen anak-anak ... itu hanya akan menyala ketika saya meninggalkan <div id="dropzone">
elemen .. melayang-layang / menyeret di mana saja dalam batas-batas elemen tidak boleh memicu dragleave
acara.
Saya ingin ini kompatibel lintas-browser, setidaknya di browser yang mendukung HTML5 drag-n-drop, jadi jawaban ini ini tidak memadai.
Sepertinya Google dan Dropbox sudah menemukan ini, tetapi kode sumber mereka diperkecil / rumit jadi saya belum bisa mengetahuinya dari penerapannya.
e.stopPropagation();