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