Visión general
Tengo la siguiente estructura HTML y he adjuntado los eventos dragenter
y dragleave
al <div id="dropzone">
elemento.
<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
Cuando arrastro un archivo sobre <div id="dropzone">
, el dragenter
evento se dispara como se esperaba. Sin embargo, cuando muevo el mouse sobre un elemento secundario, como <div id="drag-n-drop">
, el dragenter
evento se activa para el <div id="drag-n-drop">
elemento y luego el dragleave
evento se activa para el <div id="dropzone">
elemento.
Si vuelvo a pasar el cursor sobre el <div id="dropzone">
elemento nuevamente, el dragenter
evento se activa nuevamente, lo cual es genial, pero luego el dragleave
evento se activa para el elemento secundario que acaba de salir, por lo removeClass
que se ejecuta la instrucción, que no es genial.
Este comportamiento es problemático por 2 razones:
Solo estoy adjuntando
dragenter
ydragleave
al,<div id="dropzone">
así que no entiendo por qué los elementos secundarios también tienen estos eventos adjuntos.¡Todavía estoy arrastrando sobre el
<div id="dropzone">
elemento mientras se cierne sobre sus hijos, así que no quierodragleave
disparar!
jsFiddle
Aquí hay un jsFiddle para jugar: http://jsfiddle.net/yYF3S/2/
Pregunta
Entonces ... ¿cómo puedo hacerlo de tal manera que cuando estoy arrastrando un archivo sobre el <div id="dropzone">
elemento, dragleave
no se dispara incluso si estoy arrastrando sobre cualquier elemento secundario ... solo debería dispararse cuando salgo del <div id="dropzone">
elemento ... Al desplazarse / arrastrarse por cualquier lugar dentro de los límites del elemento no se debe activar el dragleave
evento.
Necesito que esto sea compatible con varios navegadores, al menos en los navegadores que admiten arrastrar y soltar HTML5, por lo que esta respuesta no es adecuada.
Parece que Google y Dropbox han resuelto esto, pero su código fuente es reducido / complejo, por lo que no he podido resolverlo a partir de su implementación.
e.stopPropagation();