Przegląd
Mam następującą strukturę HTML i dołączyłem zdarzenia dragenteri dragleavedo <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">, dragenterzdarzenie jest uruchamiane zgodnie z oczekiwaniami. Jednak, gdy poruszam myszką na element dziecięcej, takich jak <div id="drag-n-drop">The dragenterzdarzenie jest opalane dla <div id="drag-n-drop">elementu, a następnie dragleavezdarzenie jest opalane dla <div id="dropzone">elementu.
Jeśli <div id="dropzone">ponownie najeżdżam na element, dragenterzdarzenie jest ponownie uruchamiane, co jest fajne, ale potem dragleavezdarzenie jest uruchamiane dla elementu podrzędnego, który właśnie pozostał, więc removeClassinstrukcja jest wykonywana, co nie jest fajne.
To zachowanie jest problematyczne z 2 powodów:
Dołączam tylko
dragenter&dragleavedo 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ędragleavestrzelać!
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, dragleavenie 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ć dragleavezdarzenia.
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();