обзор
У меня есть следующий 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();