Panoramica
Ho la seguente struttura HTML e ho allegato gli eventi dragenter
e all'elemento.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>
Problema
Quando trascino un file sopra <div id="dropzone">
, l' dragenter
evento viene generato come previsto. Tuttavia, quando sposto il mouse su un elemento figlio, ad esempio <div id="drag-n-drop">
, l' dragenter
evento viene generato per l' <div id="drag-n-drop">
elemento e quindi l' dragleave
evento viene generato per l' <div id="dropzone">
elemento.
Se passo di nuovo sopra l' <div id="dropzone">
elemento, l' dragenter
evento viene nuovamente generato, il che è interessante, ma quindi l' dragleave
evento viene generato per l'elemento figlio appena lasciato, quindi l' removeClass
istruzione viene eseguita, che non è interessante.
Questo comportamento è problematico per 2 motivi:
Sto solo attaccando
dragenter
edragleave
al,<div id="dropzone">
quindi non capisco perché anche agli elementi per bambini siano associati questi eventi.Sto ancora trascinando l'
<div id="dropzone">
elemento mentre ho il mouse sopra i suoi figli, quindi non vogliodragleave
sparare!
jsFiddle
Ecco un jsFiddle da armeggiare con: http://jsfiddle.net/yYF3S/2/
Domanda
Quindi ... come posso renderlo tale che quando trascino un file sopra l' <div id="dropzone">
elemento, dragleave
non si attiva anche se sto trascinando su tutti gli elementi figlio ... dovrebbe sparare solo quando lascio l' <div id="dropzone">
elemento .. il passaggio del mouse / trascinamento in qualsiasi punto all'interno dei limiti dell'elemento non deve attivare l' dragleave
evento.
Ho bisogno che questo sia compatibile con più browser, almeno nei browser che supportano il trascinamento della selezione HTML5, quindi questa risposta non è adeguata.
Sembra che Google e Dropbox lo abbiano capito, ma il loro codice sorgente è minimizzato / complesso, quindi non sono stato in grado di capirlo dalla loro implementazione.
e.stopPropagation();