Vue d'ensemble
J'ai le code HTML suivant la structure et j'ai attaché l' dragenter
et dragleave
événements à l' <div id="dropzone">
élément.
<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>
Problème
Lorsque je fais glisser un fichier sur l' <div id="dropzone">
, dragenter
événement est déclenché comme prévu. Cependant, lorsque je passe ma souris sur un élément enfant, tels que <div id="drag-n-drop">
, dragenter
événement est déclenché pour l' <div id="drag-n-drop">
élément et ensuite l' dragleave
événement est déclenché pour l' <div id="dropzone">
élément.
Si j'ai passez la souris sur l' <div id="dropzone">
élément nouveau, l' dragenter
événement est de nouveau tiré, ce qui est cool, mais alors l' dragleave
événement est déclenché pour l'élément enfant juste à gauche, de sorte que le removeClass
instruction est exécutée, ce qui n'est pas cool.
Ce comportement est problématique pour 2 raisons:
Je suis le seul à en fixer
dragenter
&dragleave
de la<div id="dropzone">
donc je ne comprends pas pourquoi les enfants des éléments de ces événements.Je suis toujours en faisant glisser le pointeur sur l'
<div id="dropzone">
élément, tout en planant au-dessus de ses enfants donc je ne veux pasdragleave
de le feu!
jsFiddle
Voici un jsFiddle pour bricoler avec: http://jsfiddle.net/yYF3S/2/
Question
Alors... comment puis-je faire pour que lorsque je suis en faisant glisser un fichier sur l' <div id="dropzone">
élément, dragleave
ne se déclenche pas même si je suis en faisant glisser le pointeur sur tous les enfants des éléments... il faut que du feu quand je sors de l' <div id="dropzone">
élément... planant/glisser n'importe où dans les limites de l'élément ne doit pas déclencher l' dragleave
événement.
J'ai besoin de cela pour être compatible avec tous les navigateurs, au moins dans les navigateurs qui le supportent HTML5 drag-n-drop, de sorte que cette réponse n'est pas adéquate.
Il semble que Google et Dropbox ont compris cela, mais leur code source est minimisé/complexe, donc je n'ai pas été en mesure de le comprendre à partir de leur mise en œuvre.