Visão geral
Eu tenho a seguinte estrutura HTML e anexei os eventos dragenter
e dragleave
ao <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 dragenter
evento é disparado conforme o esperado. No entanto, quando movo o mouse sobre um elemento filho, como <div id="drag-n-drop">
, o dragenter
evento é disparado para o <div id="drag-n-drop">
elemento e, em seguida, o dragleave
evento é disparado para o <div id="dropzone">
elemento.
Se eu passar o mouse sobre o <div id="dropzone">
elemento novamente, o dragenter
evento é acionado novamente, o que é legal, mas o dragleave
evento é acionado para o elemento filho que acabou de sair, para que a removeClass
instrução seja executada, o que não é legal.
Esse comportamento é problemático por 2 razões:
Estou apenas anexando
dragenter
&dragleave
ao,<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 quererdragleave
disparar!
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, dragleave
nã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 dragleave
evento.
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();