drag
简述
当拖动某一个元素的时候,将会先后触发 dragstart,drag,dragend 事件。
当某个元素被拖到有效放置目标上时,先后触发 dragenter,dragover,drop或dragleave。
某些元素不允许被放置,这个时候取消这些元素 dragenter 和 dragover 的默认行为就可以将该元素转为可被放置的目标。
另外,一些元素有默认的放置行为,这个时候,将 drop 的默认行为去除就行了。
要把一个元素设置为可拖动的,可以按照如下设置:
dataTransfer
拖放可以实现数据交换,这是通过 dataTransfer 对象完成的,它是拖动过程中事件对象的一个属性,dataTransfer 主要的两个方法是 getData 和 setData
setData
format 的值是一种 MIME 类型,考虑到向后兼容,也可以是 text 和 url,这两个类型被映射为 text/plain 和 text/url-list,在IE10及以前不支持 MIME 类型名称。另外,Firefox 5 之前的版本不能正确的将 text 和 url 映射成 text/plain 和 text/url-list ,但是却能将 Text 映射成 text/plain,因此,获取 URL 的时候最好两个都检测一下,获取 text 则将第一个改为大写,这样可以获得更高的兼容性。
getData
指定MIME类型(以及 text 和 url ,规则同上)获取数据。
dropEffect 和 effectAllowed
这两个属性决定这被拖动元素移动到某放置目标上的时候鼠标的外观,这与行为无关。
dropEffect 的有以下值:
- none
 - move
 - copy
 - link
 
effectAllowed 有以下值:
- uninitialized
 - none
 - copy
 - link
 - move
 - copyLink
 - copyMove
 - linkMove
 - all
 
值得注意的是,要在 ondragstart 中设置 effectAllowed 属性,在 ondragengter 中设置 dropEffect 属性。
当 effectAllowed 和 dropEffect “匹配”的时候就能显示指定的鼠标样式(如:dropEffect 为 copy,effectAllowed 为 copyLink,则显示为一个带有加号的鼠标样式,注意,该鼠标样式是在 macOS 的 Chrome 下进行观察的)。
我进行测试的时候发现,是否设置被放置元素 dragenter 事件中 dropEffect 的属性与鼠标显示无关,鼠标的显示与 effectAllowed 有关。
其他
dataTransfer 还有其他方法属性:
- addElement(element) 在 
dataTransfer上添加一个元素类型的数据 - clearData(format) 清除某类型的数据
 - setDragImage(element, x, y) 设置拖动的时候光标旁边显示的图像
 - types 当前保存的数据类型,一个类数组对象