12.5更新
拖拽
前端经常使用拖拽进行图片上传,那么拖拽是如何实现的呢?
使用拖拽基本过程如下:首先定义哪些元素是可拖动的,在鼠标左键点击一个可拖动元素进行拖拽;拖拽元素进行移动,拖拽元素的位置发生改变,可以通过绝对定位实现;鼠标释放拖拽元素。
HTML5实现
拖拽删除元素实例
1 | <div id="main">垃圾桶</div> |
Javascript代码:
1 | var dragElement = document.getElementById("test-drag"); |
API
可拖拽对象
通过设置draggable
属性draggable
:true
表明可拖拽draggable
:false
表明元素不可拖拽draggable
:auto
默认,只有img
图片,a
链接,input
文字选中三种情况可拖拽
拖拽对象API
dragstart
:可拖拽元素拖拽开始时触发drag
:可拖拽元素拖拽触发dragend
:可拖拽元素拖拽结束时触发
目标对象API
dragenter
:可拖拽元素进入目标放置区域触发dragexit
:可拖拽元素不再是拖动操作的直接选择目标。dragleave
:可拖拽元素离开目标放置区域触发dragover
:可拖拽元素在目标放置区域移动时触发drop
:可拖拽元素在目标放置区域放置时触发
注意:dragenter
和dragover
事件的默认行为是不允许被拖拽元素在其他元素上释放或放置(即无法触发drop
事件),需要通过 event.preventDefault()
或者return false
来阻止默认行为才能触发后续的drop
事件。(实测只需要dragover
事件阻止默认事件)
event.dataTransfer
对象
属性
DataTransfer
对象用于在配置拖拽行为效果,并且在拖拽过程的各事件间传递数据信息。它存储在事件对象当中,下面我们逐步了解它吧。
[object DragEvent]
对象
继承自[object MouseEvent]
对象,其实就多了个{DataTransfer}
dataTransfer
属性
[object DataTransfer]
对象详解
上文说到DataTransfer
对象可用于传递数据信息,而数据信息的数据类型被限定为字符串和文件类型
effectAllowed
和dropEffect
属性
这个两个属性对于初次接触DnD的朋友来说,可谓最令人摸不着头脑的,网上和各书籍上对这两个属性的解释均不全面,下面我试图尽量把它们讲明白effectAllowed
和dropEffect
最主要的作用是,用于配置拖拽操作过程中鼠标指针的类型以便提示用户后续可执行怎样的操作;其次的作用是,控制 drop 事件的触发与否。
effectAllowed
作用:用于设置被拖拽元素可执行的操作。
取值范围:copy
,限定dropEffect
的属性值为copy
,否则会鼠标指针为禁止样式link
,限定dropEffect
的属性值为link
,否则会鼠标指针为禁止样式move
,限定dropEffect
的属性值为move
,否则会鼠标指针为禁止样式copyLink
,限定dropEffect
的属性值为copy
和link
,否则会鼠标指针为禁止样式copyMove
,限定dropEffect
的属性值为copy
和move
,否则会鼠标指针为禁止样式linkMove
,限定dropEffect
的属性值为link
和move
,否则会鼠标指针为禁止样式all
,允许dropEffect
的属性值为任意值none
,鼠标指针一直为禁止样式,不管dropEffect
的属性值是什么uninitialized
,没有限定dropEffect
属性的值,效果和all
一样。注意:仅能在
dragstart
事件中设置该属性,其他事件中设置均无效。
dropEffect
作用:用于设置目标元素将执行的操作,若属性值属于effectAllowed
范围内,则鼠标指针将显示对应的指针样式,否则则显示禁止的指针样式。
取值范围:copy
:被拖拽元素将被复制到目标元素内,若属于effectAllowed
范围内时,则鼠标指针显示复制的样式,否则则显示禁止的指针样式。link
被拖拽元素将以超链接的形式打开资源(具体是否打开资源请参考七、2),若属于effectAllowed
范围内时,则鼠标指针显示超链接的样式,否则则显示禁止的指针样式。move
:被拖拽元素将被移动到目标元素内,若属于effectAllowed
范围内时,则鼠标指针显示移动的样式,否则则显示禁止的指针样式。none
:被拖拽元素不能在目标元素上作任何操作,一直显示禁止的指针样式。除了文本框外其他元素的默认值均为none
注意:
- 仅能在
dragover
事件中设置该属性值,其他事件中设置均无效- 当显示禁止的指针样式时,将无法触发目标元素的 drop 事件。
方法
DataTransfer.getData()
获取DataTransfer
对象中的一个数据DataTransfer.setData()
在DataTransfer
对象中添加一个数据DataTransfer.clearData()
在DataTransfer
对象中删除一个数据
拖拽过程
在上述实例中,我们使用HTML5 drap
和drop
实现了一个拖拽一个元素到指定区域中进行删除。HTML5新增drag
事件以方便解决拖拽问题。
首先,在这个过程中我们要定义一个可拖拽元素,对拖拽添加属性draggable="true"
即可定义该元素为可拖拽对象。
第二,在拖拽元素开始后,可以通过drag
事件的dataTransfer
对象进行数据的传递。可设置数据来传递文件等。在上述例子中event.dataTransfer.setData()
传递被删除元素的ID。
第三,放置拖拽元素,通常情况下页面元素为不可放置拖拽元素区域。放置拖拽元素是通过对目标元素的drop
事件实现,但是只有目标元素dragenter
和dragover
的触发事件最后必须通过取消事件来防止默认处理,即为return false
或阻止默认事件event.preventDefault()
,则该目标元素才为可放置拖拽元素区域,drop
事件才会被触发。否则不会触发drop
事件。