Visión general
Tengo la siguiente estructura HTML y he adjuntado los eventos dragentery dragleaveal <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 dragenterevento se dispara como se esperaba. Sin embargo, cuando muevo el mouse sobre un elemento secundario, como <div id="drag-n-drop">, el dragenterevento se activa para el <div id="drag-n-drop">elemento y luego el dragleaveevento se activa para el <div id="dropzone">elemento.
Si vuelvo a pasar el cursor sobre el <div id="dropzone">elemento nuevamente, el dragenterevento se activa nuevamente, lo cual es genial, pero luego el dragleaveevento se activa para el elemento secundario que acaba de salir, por lo removeClassque se ejecuta la instrucción, que no es genial.
Este comportamiento es problemático por 2 razones:
Solo estoy adjuntando
dragenterydragleaveal,<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 quierodragleavedisparar!
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, dragleaveno 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 dragleaveevento.
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();