拖放事件
dom被拖拽--->经过一些dom--->到达指定dom
-
被拖拽的dom:(源对象)
dragstart 源对象被拖拽
drag 源对象拖拽过程中
dragend 源对象拖拽结束(drop事件后执行)
-
拖拽过程中经过的dom:(过程对象)
dragenter 源对象进入过程对象
dragover 源对象在过程对象中移动 (设置event.preventDefault(),否则drop事件不会执行)
drageleave 源对象离开过程对象
-
拖拽到达指定的dom:(目标对象)
drop 拖放到指定目标对象内
-
dataTransfer对象:(拖拽过程中数据传递对象)
setData()存入数据
支持格式:text/plain、text/html、text/xml、text/url-list
getData()
clearData()
实现
实现目录可在同级、子级拖动
思路:
- 在dragstart时向dataTransfer对象存入源对象的数据
- 在dragenter时给过程对象加同级拖拽标识
-
在dragenter时同时记录下进入时鼠标的坐标(x1, y1)
-
当dragover时依然记录下鼠标的坐标(x2, y2)
-
设定规则加子级拖拽标识,例如:Math.abs(x2-x1) > 50
- 当dragleave时,去掉所有标识
- 当drop时,获取dataTransfer对象的数据,并更新拖拽数据
- 当dragend时,去掉所有标识
效果
- 拖拽到子级
2.拖拽到同级
此例子是结合vue递归组件实现:vue-drag
更多专业前端知识,请上 【猿2048】www.mk2048.com