总览
我具有以下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();