我有以下 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">
)上时,将为 <div id="drag-n-drop">
元素触发 dragenter
事件,然后为 <div id="dropzone">
元素触发 dragleave
事件。
如果我再次将鼠标悬停在 <div id="dropzone">
元素上,dragenter
事件将再次被激发,这很酷,但是对于刚刚离开的子元素,dragleave
事件将被激发,因此执行 removeClass
指令,这并不酷。
这种行为是有问题的,原因有二:
我只是附加 dragenter
和 dragleave
到 <div id="dropzone">
,所以我不明白为什么子元素有这些事件附加以及。
我仍然拖动在 <div id="dropzone">
元素,同时悬停在其子级,所以我不希望 dragleave
发射!
这里有一个可以修补的 jsFiddle: http://jsfiddle.net/yYF3S/2/
所以... 我怎样才能使它成为这样,当我拖动一个文件在 <div id="dropzone">
元素上,即使我拖动任何子元素,dragleave
也不会触发... 它应该只有在我离开 <div id="dropzone">
元素时才会触发... 悬停/拖动在元素 不应该的边界内的任何地方触发 dragleave
事件。
我需要这是跨浏览器兼容,至少在浏览器,支持 HTML5拖放,所以 这个答案是不够的。
看起来 Google 和 Dropbox 已经解决了这个问题,但是他们的源代码是缩小/复杂的,所以我还没能从他们的实现中解决这个问题。