如何防止dragleave干扰嵌套dropzone元素上的dragenter事件?

Posted

技术标签:

【中文标题】如何防止dragleave干扰嵌套dropzone元素上的dragenter事件?【英文标题】:How to prevent dragleave interfering with dragenter event on nested dropzone element? 【发布时间】:2019-05-26 08:22:24 【问题描述】:

dropzone 中有两个嵌套元素并从外部元素拖动到内部元素,dragleave 操作优先于dragenter

我最初有一个 div 为dropzone,它在 dragenter 更改类('canDrop')以指示是否可以放置,而在 dragleave 类恢复为中性('plainDropZone')。

删除时,draggable div 成为 dropzone div 的子级。现在,当另一个draggable 进入dropzone 时,类更改为“noDrop”以指示不再有任何丢弃。在dragleave 上,该类再次恢复为中性('plainDropZone')

问题:当从外部 dropzone div 拖动到内部放置的 div 时,外部 dropzone div 不应恢复为中性,但仍具有类 'noDrop'。

据我所知,这并没有按预期工作,因为当从外部 div 移动到内部 div 时,dragleavedragenter 之后被触发。这个线程很好地可视化了这个问题:html 5 drag events: 'dragleave' fired after 'dragenter'

这是一个完整的演示:https://jsfiddle.net/e12uadgh/

那么,当外部dropzone div 有一个放置的内部div 并且用户将第三个div 从外部dropzone div 拖动到内部放置的div 时,将如何分配外部dropzone div 类“noDrop”?

【问题讨论】:

【参考方案1】:

找到了实现效果的方法。当将元素从外部 dropzone div 拖动到内部 dropzone div 时,外部 div 的 dragleave 在内部 div 的 dragenter 之后触发,因此 dragenter 上的任何更改都会被 dragleave 上的更改覆盖。

因此,如果下一个事件目标不是内部 div,则一种解决方案是仅对 dragleave 进行更改。由于这不能通过检查dragleave 上的event.target 来完成,因此我们可以使用切换来代替,它在内部 div 上的dragenter 上设置为 true,而在内部 div 上的dragleave 上设置为 false。

这是一个演示:https://jsfiddle.net/rookie_sen/2Lp5qg39/5/

【讨论】:

以上是关于如何防止dragleave干扰嵌套dropzone元素上的dragenter事件?的主要内容,如果未能解决你的问题,请参考以下文章

React dropzone-将文件拖动到dropzone上时触发dragLeave事件

dragenter/dragleave 防止 drop 发射

嵌套的 Ember.View dragEnter dragLeave 调用顺序错误?

如何防止两个 CUDA 程序相互干扰

如何检测dragLeave

如何防止 UITableViewCell 内的手势干扰 UITableView 的滚动?