总览
我具有以下HTML结构,并且将dragenter和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>
问题
当我将文件拖到时<div id="dropzone">,dragenter事件将按预期触发。但是,当我将鼠标移到子元素(例如)上时<div id="drag-n-drop">,会dragenter为该<div id="drag-n-drop">元素dragleave触发该事件,然后为该<div id="dropzone">元素触发该事件。
如果我<div id="dropzone">再次将鼠标悬停在该元素上,dragenter则会再次触发该事件,这很酷,但是随后dragleave为刚刚剩下的子元素触发了该事件,因此removeClass执行了该指令,这并不酷。
此行为有问题的原因有两个:
我只是附上
dragenter&dragleave,<div id="dropzone">所以我不明白为什么子元素也要附加这些事件。我仍在将
<div id="dropzone">元素悬停在其子元素上时拖动元素,所以我不想dragleave开火!
jsFiddle
这是一个可以修补的jsFiddle: http //jsfiddle.net/yYF3S/2/
题
所以...我该怎么做,以至于当我在<div id="dropzone">元素上拖动文件时,dragleave即使我在任何子元素上拖动也不会触发...仅当我离开该<div id="dropzone">元素时才触发。 。在元素边界内的任何位置悬停/拖动都不会触发dragleave事件。
我需要它与跨浏览器兼容,至少在支持HTML5拖放的浏览器中是这样,所以这个答案是不够的。
似乎Google和Dropbox已经解决了这一问题,但是它们的源代码是缩小的/复杂的,因此我无法从其实现中解决这一问题。
e.stopPropagation();