Visão geral
Eu tenho a seguinte estrutura HTML e anexei os eventos dragentere dragleaveao <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
Quando arrasto um arquivo sobre o <div id="dropzone">, o dragenterevento é disparado conforme o esperado. No entanto, quando movo o mouse sobre um elemento filho, como <div id="drag-n-drop">, o dragenterevento é disparado para o <div id="drag-n-drop">elemento e, em seguida, o dragleaveevento é disparado para o <div id="dropzone">elemento.
Se eu passar o mouse sobre o <div id="dropzone">elemento novamente, o dragenterevento é acionado novamente, o que é legal, mas o dragleaveevento é acionado para o elemento filho que acabou de sair, para que a removeClassinstrução seja executada, o que não é legal.
Esse comportamento é problemático por 2 razões:
Estou apenas anexando
dragenter&dragleaveao,<div id="dropzone">para não entender por que os elementos filhos também têm esses eventos anexados.Ainda estou arrastando o
<div id="dropzone">elemento enquanto passa o mouse sobre seus filhos, para não quererdragleavedisparar!
jsFiddle
Aqui está um jsFiddle para mexer com: http://jsfiddle.net/yYF3S/2/
Questão
Então ... como posso fazer isso de modo que, ao arrastar um arquivo sobre o <div id="dropzone">elemento, dragleavenão seja acionado, mesmo se estiver arrastando sobre qualquer elemento filho ... ele deve ser acionado somente quando eu deixar o <div id="dropzone">elemento .. pairar / arrastar ao redor de qualquer lugar dentro dos limites do elemento não deve acionar o dragleaveevento.
Eu preciso que isso seja compatível com vários navegadores, pelo menos nos navegadores que oferecem suporte ao arrastar e soltar HTML5, portanto, essa resposta não é adequada.
Parece que o Google e o Dropbox descobriram isso, mas o código fonte é minificado / complexo, então não consegui descobrir isso com a implementação.
e.stopPropagation();