概述
我有以下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">
元素触发,然后为 <div id="dropzone">
元素触发 dragleave
事件。
如果我再次悬停在 <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 拖放的浏览器中跨浏览器兼容,因此这个答案是不够的。
谷歌和 Dropbox 看起来已经解决了这个问题,但他们的源代码被压缩/混淆了,因此我无法从他们的实现中找到解决方法。
e.stopPropagation();
阻止事件传播。 - Blender