обзор
У меня есть следующий HTML - структура , и я приложил dragenterи dragleaveсобытие к <div id="dropzone">элементу.
<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>
проблема
Когда я перетаскиваю файл поверх <div id="dropzone">, dragenterсобытие запускается, как и ожидалось. Однако, когда я перемещаю мышь над дочерним элементом, например <div id="drag-n-drop">, dragenterсобытие запускается для <div id="drag-n-drop">элемента, а затем dragleaveсобытие запускается для <div id="dropzone">элемента.
Если я снова наведу указатель мыши на <div id="dropzone">элемент, dragenterсобытие снова будет запущено, что круто, но затем dragleaveсобытие будет запущено для оставленного дочернего элемента, поэтому выполняется removeClassинструкция, что не круто.
Такое поведение проблематично по 2 причинам:
Я только прикрепление
dragenterиdragleaveк<div id="dropzone">так что я не понимаю , почему дети элементы имеют эти события присоединенные также.Я все еще перетаскиваю
<div id="dropzone">элемент, нависая над его дочерними элементами, поэтому я не хочуdragleaveстрелять!
jsFiddle
Вот jsFiddle, с которым можно повозиться: http://jsfiddle.net/yYF3S/2/
Вопрос
Итак ... как сделать так, чтобы при перетаскивании файла поверх <div id="dropzone">элемента dragleaveон не срабатывал, даже если перетаскивал какие-либо дочерние элементы ... он должен срабатывать только при выходе из <div id="dropzone">элемента зависание / перетаскивание в любом месте в пределах границ элемента не должно вызывать dragleaveсобытие.
Мне нужно, чтобы он был совместим с разными браузерами, по крайней мере, в браузерах, которые поддерживают перетаскивание HTML5, поэтому этот ответ не подходит.
Кажется, что Google и Dropbox выяснили это, но их исходный код минимизирован / сложен, поэтому я не смог понять это из их реализации.
e.stopPropagation();