Przegląd
Mam następującą strukturę HTML i dołączyłem zdarzenia dragenter
i dragleave
do <div id="dropzone">
elementu.
<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>
Problem
Kiedy przeciągam plik na <div id="dropzone">
, dragenter
zdarzenie jest uruchamiane zgodnie z oczekiwaniami. Jednak, gdy poruszam myszką na element dziecięcej, takich jak <div id="drag-n-drop">
The dragenter
zdarzenie jest opalane dla <div id="drag-n-drop">
elementu, a następnie dragleave
zdarzenie jest opalane dla <div id="dropzone">
elementu.
Jeśli <div id="dropzone">
ponownie najeżdżam na element, dragenter
zdarzenie jest ponownie uruchamiane, co jest fajne, ale potem dragleave
zdarzenie jest uruchamiane dla elementu podrzędnego, który właśnie pozostał, więc removeClass
instrukcja jest wykonywana, co nie jest fajne.
To zachowanie jest problematyczne z 2 powodów:
Dołączam tylko
dragenter
&dragleave
do tego,<div id="dropzone">
więc nie rozumiem, dlaczego elementy dziecięce mają również dołączone te zdarzenia.Ciągle przeciągam po
<div id="dropzone">
elemencie, najeżdżając na jego elementy podrzędne, więc nie chcędragleave
strzelać!
jsFiddle
Oto jsFiddle do majstrowania przy: http://jsfiddle.net/yYF3S/2/
Pytanie
Więc ... jak mogę to zrobić tak, że kiedy przeciągam plik po <div id="dropzone">
elemencie, dragleave
nie uruchamia się, nawet jeśli przeciągam po elementach podrzędnych ... powinien uruchamiać się tylko wtedy, gdy opuszczam <div id="dropzone">
element .. . Najechanie kursorem / przeciągnięcie po dowolnym miejscu w granicach elementu nie powinno wywołać dragleave
zdarzenia.
Potrzebuję tego, aby był kompatybilny z różnymi przeglądarkami, przynajmniej w przeglądarkach obsługujących przeciąganie i upuszczanie HTML5, więc ta odpowiedź nie jest wystarczająca.
Wygląda na to, że Google i Dropbox to rozgryzły, ale ich kod źródłowy jest zminimalizowany / złożony, więc nie byłem w stanie tego rozgryźć na podstawie ich implementacji.
e.stopPropagation();