微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

html5 – dragexit vs dragleave – 应该使用哪个?

HTML Drag and Drop API定义了两个非常相似的事件,dragleave和dragexit,它们与dragenter一起用于帮助跟踪当前的放置目标.

快速搜索没有发现任何当前和清晰的两个事件的文档,当一个应该用于另一个,以及浏览器支持,所以我想我会在这里问.

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

> HTML specification详细描述了每个事件应该被触发的时间,但它需要一些解密.
> MDN文档(HTML Drag and Drop API和单独的dragexit/dragleave页面)没有多大帮助,说“当元素不再是拖动操作的直接选择目标时,会触发dragexit事件.” /“当拖动的元素或文本选择留下有效的放置目标时,会触发dragleave事件.”并且没有提供有关dragexit的浏览器支持的信息(截至2017-03)
> Dottoro’s dragexit docs(谷歌的另一个热门歌曲)似乎已经过时了,声称“版本3.5中的dragexit事件在Firefox中已经过时了.请改用ondragleave事件.”
> Mozilla’s bug 619703W3C 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

解决方法

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

Firefox event sequence is

  1. dragexit
  2. dragleave
  3. drop

但Chrome从未发起过dragexit事件.

Chrome event sequence is

  1. dragleave
  2. drop

关于dragexit事件的进一步分析,我在维基百科发现它是Mozilla XUL events的一部分,它说:

In addition to the common/W3C events,Mozilla defined a set of events that work only with XUL elements

如果你需要代码片段,这里是plunkr的dragexit和dragleave事件片段.

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显示DnD API可以完全实现,而不使用dragexit事件,并不是所有浏览器都完全支持.您可以安全地使用dragleave事件,而不是所有主流浏览器都支持.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。