dragexit vs dragleave - 应该使用哪个?

Posted

技术标签:

【中文标题】dragexit vs dragleave - 应该使用哪个?【英文标题】:dragexit vs dragleave - which should be used? 【发布时间】:2017-08-04 03:29:52 【问题描述】:

html 拖放 API 定义了两个非常相似的事件,dragleavedragexit,它们与 dragenter 一起旨在帮助跟踪当前放置目标。

快速搜索并没有找到关于这两个事件的任何当前和清晰的文档,什么时候应该使用另一个事件,以及浏览器支持,所以我想我会在这里问。

我将分享我目前找到的资源:

HTML specification 详细描述了每个事件的触发时间,但需要进行一些解读。 MDN 文档(HTML Drag and Drop API 和个人 dragexit/dragleave 页面)没有太大帮助,说 “当元素不再是拖动操作的直接选择目标时,会触发 dragexit 事件。” / “当拖动的元素或文本选择离开有效的放置目标时,会触发 dragleave 事件。” 并且没有提供有关浏览器对 dragexit 支持的信息(截至 2017 年 3 月) Dottoro's dragexit docs(Google 的另一个热门歌曲)似乎已经过时,声称“从 3.5 版开始,Firefox 中的 dragexit 事件已过时。请改用 ondragleave 事件。” Mozilla's bug 619703 和 W3C bug 11568 引用了这两个事件的历史: 看起来 Gecko/Firefox 最初实现了dragexit,而 IE 至少实现了dragleave,主要区别在于事件的顺序:dragexit 在对应的dragenter 之前触发,而dragleave,令人困惑的是,在之后触发. HTML5 规范最初仅使用 IE 语义定义 dragleave,但后来(~2013 年)添加了带有 Mozilla 语义的 dragexit。 Gecko 似乎在 Firefox 3.5 (2009) 中实现了 dragleave,最初是 dragexit 的同义词,但后来(4.0,~2011?)对其进行了更改以符合规范。 caniuse 表示现代浏览器或多或少支持 HTML DnD API,但没有具体说明 dragexit

【问题讨论】:

【参考方案1】:

我从 MDN 获取代码示例并在 Chrome 57.0.2987.110 和 Firefox 52.0.2 上运行。

Firefox 事件序列是

    dragexit 拖动离开 放下

但 Chrome 从未触发过 dragexit 事件。

Chrome 事件序列是

    拖动离开 放下

dragexit事件的进一步分析,我在***中发现它是Mozilla XUL events的一部分,上面写着:

除了常见的/W3C 事件之外,Mozilla 还定义了一组仅适用于 XUL 元素的事件

如果你需要代码 sn-ps,这里是 dragexitdragleave event sn-p from plunkr。

document.addEventListener("dragexit", function(event) 
  console.log(event.type);
  // reset the transparency
  event.target.style.opacity = "";
, false);

document.addEventListener("dragleave", function(event) 
  console.log(event.type);
  // reset background of potential drop target when the draggable element leaves it
  if (event.target.className == "dropzone") 
    event.target.style.background = "";
  

, false);

有一个有趣的tutorial 表明无需使用并非所有浏览器都完全支持的dragexit 事件即可完全实现DnD API。安全的选择是使用所有主流浏览器都支持的dragleave 事件。

【讨论】:

以上是关于dragexit vs dragleave - 应该使用哪个?的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 拖放事件 - dragLeave 在放置前触发

dragenter/dragleave 防止 drop 发射

DragDrop - DragEnter/DragLeave 事件持续触发

wpf dragenter/dragleave 问题

在窗口外拖动时如何检测Firefox中的dragleave事件

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