我遇到的问题是,dragleave
悬停该元素的子元素时会触发该元素的事件。另外,dragenter
在再次将父元素悬停时不会触发。
我做了一个简化的提琴:http : //jsfiddle.net/pimvdb/HU6Mk/1/。
HTML:
<div id="drag" draggable="true">drag me</div>
<hr>
<div id="drop">
drop here
<p>child</p>
parent
</div>
使用以下JavaScript:
$('#drop').bind({
dragenter: function() {
$(this).addClass('red');
},
dragleave: function() {
$(this).removeClass('red');
}
});
$('#drag').bind({
dragstart: function(e) {
e.allowedEffect = "copy";
e.setData("text/plain", "test");
}
});
要做的是div
在拖曳某物时通过将其下拉为红色来通知用户。这可行,但是如果您拖入p
孩子,则将dragleave
被发射,而div
不再是红色。返回到下拉列表div
也不会再次使其变为红色。有必要将其完全移出拖放div
,然后再次拖动回拖放以使其变为红色。
Is it possible to prevent dragleave
from firing when dragging into a child element?
2017 Update: TL;DR, Look up CSS pointer-events: none;
as described in @H.D.'s answer below that works in modern browsers and IE11.
当鼠标指针离开目标容器的拖动区域时,将触发“ dragleave ”事件。
这很有意义,因为在许多情况下,只有父级是可丢弃的,而不是后代。我认为event.stopPropogation()应该已经处理了这种情况,但似乎无法解决问题。
上面提到的某些解决方案似乎确实适用于大多数情况,但是对于那些不支持Dragenter / dragleave事件的子级(例如iframe)的情况,则失败。
一种解决方法是检查event.relatedTarget并验证它是否位于容器内,然后像我在此处所做的那样忽略dragleave事件:
您可以在这里找到有用的小提琴!