本文来自网易云社区

作者:刘凌阳

前言

本文依据半年前本人的分享《浅谈js拖拽》撰写,算是一篇迟到的文章。

基本思路

虽然现在关于拖拽的组件库到处都是,HTML5也把拖放纳入了标准。但考虑到兼容问题,我们还是从最古老的方式开始讲起。

onmousedown:模拟开始拖拽事件。   鼠标按键按下即发生  onmousedown  事件。  获取鼠标位置,获取被拖拽元素的位置,记录两者之间的纵横坐标的差值。对  document  元素绑定  onmousemove,onmouseup  事件。

为什么是对  document  绑定而不是对被拖动的元素绑定呢?原来是如果对被拖动元素绑定的话当鼠标拖动过快时,会导致鼠标与被拖动元素的脱离。

onmousemove:模拟拖拽中事件。  鼠标拖动即发生  onmousemove  事件。  将被拖拽元素的  position  改成绝对位置,这个可以通过  left  和  top  改变该元素的位置,从而使得该元素随着鼠标的拖拽而移动。获取鼠标位置,将鼠标  x  坐标(  e.clientX  )减去第  2  步储存的横坐标差作为被拖动元素的  left  值,将鼠标y  坐标(  e.clientY  )减去第  2  步储存的纵坐标差作为被拖动元素的  top  值。实现元素跟随鼠标拖动的效果。

onmouseup:模拟拖拽结束事件。  鼠标按键弹起即发生  onmouseup  事件。可以回收  onmousemove  和  onmousedown中的  事件和变量,一次拖拽至此结束。

(  nej  也提供了拖拽的一个简单案例,位于  util/dragger/  下,代码就不贴出来了,有兴趣的童鞋可以自行查阅,毕竟看文字实在是过于枯燥了。  )

HTML5拖放

有古老的方式自然有潮流的方式,如果你无需考虑兼容性问题的话,笔者强烈建议你使用HTML5提供的拖放API   。如果你还未曾了解,提供你一个  简单的HTML5拖放实例  http://www.w3school.com.cn/tiy/t.asp?f=html5_draganddrop

让我们一起来看看HTML5拖放相关的一些知识点。

7个事件:

dragstart  :当用户开始拖动对象时触发。

dragenter  :    当鼠标第一次经过目标元素,且有拖动发生时触发。此事件的监听者应指明在这个位置上是否允许  drop  ,或者监听者不执行任何操作,那么  drop  默认是不允许的。

dragover  :当鼠标经过一个元素时,且有拖动发生时触发    。

dragleave  :当鼠标离开一个元素,且有拖动在发生时触发。

drag  :    当对象被拖动,每次移动鼠标时触发。

drop  :在  drag  操作的最后发生  drop  时,在元素上触发此事件。监听者应该负责检索拖动的数据,并插入  drop  的位置。

dragend  :    在拖动对象时放开鼠标按键时触发。

draggable属性:

如果网页元素的draggable元素为true,这个元素就是可以拖动的。

<div draggable="true">Draggable Div</div>

dataTransfer对象:

拖动过程中,回调函数接受的事件参数,有一个dataTransfer属性。它指向一个对象,包含了与拖动相关的各种信息。

dataTransfer对象的属性:

  • dropEffect:拖放的操作类型,决定了浏览器如何显示鼠标形状,可能的值为copy、move、link和none。

  • effectAllowed:指定所允许的操作,可能的值为copy、move、link、copyLink、copyMove、linkMove、all、none和uninitialized(默认值,等同于all,即允许一切操作)。

  • files:包含一个FileList对象,表示拖放所涉及的文件,主要用于处理从文件系统拖入浏览器的文件。

  • types:储存在DataTransfer对象的数据的类型。

  • dataTransfer对象的方法:

  • setData(format, data):在dataTransfer对象上储存数据。第一个参数format用来指定储存的数据类型,比如text、url、text/html等。

  • getData(format):从dataTransfer对象取出数据。

  • clearData(format):清除dataTransfer对象所储存的数据。如果指定了format参数,则只清除该格式的数据,否则清除所有数据。

  • setDragImage(imgElement, x, y):指定拖动过程中显示的图像。默认情况下,许多浏览器显示一个被拖动元素的半透明版本。参数imgElement必须是一个图像元素,而不是指向图像的路径,参数x和y表示图像相对于鼠标的位置。

dataTransfer对象,   允许在其上存储数据,这使得在被拖动元素与目标元素之间传送信息成为可能。

e.preventDefault():

ondragover有一个默认行为,那就是当  ondragover触发时,ondrop会失效!

如何阻止?

ondragover = function(e){e.preventDefault();    ....}

附一张整理好的图片供大家理解:

案例

扯了这么多,最后再举个栗子来结束本文。先上图片...

这是笔者在网易有数项目中的一个需求,实现文件拖拽上传。

实现步骤:

1.监听事件

其中dragenter和dragleave只是处理了外框高亮的效果,如上面图片所示。

需要注意的是一定要将dragover的默认事件取消掉,不然无法触发drop事件。可以用preventDefault(),也可以用nej的_v._$stop(_event)。如需拖拽页面里的元素,需要给其添加属性draggable=”true”。这些上文已经有所提及。

2.处理drop事件

在drop事件回调函数中通过_event.dataTransfer.files获取拖拽文件列表。dataTransfer对象真是个好东西。

3.发送文件数据

使用FormData模拟表单数据AJAX提交文件流。

至此,HTML5的文件拖拽上传就实现了,是不是很easy?

网易云大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者刘凌阳授权发布

相关文章:
【推荐】 Innodb实践总结(一)
【推荐】 网易易盾验证码的安全策略
【推荐】 nova状态同步

浅谈js拖拽的更多相关文章

  1. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  2. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  3. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  4. js拖拽效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  6. 浅谈 js 正则字面量 与 new RegExp 执行效率

    原文:浅谈 js 正则字面量 与 new RegExp 执行效率 前几天谈了正则匹配 js 字符串的问题:<js 正则学习小记之匹配字符串> 和 <js 正则学习小记之匹配字符串优化 ...

  7. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

  8. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  9. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

随机推荐

  1. ListView实现下拉动态渲染数据

    欢迎讨论欢迎一起学习:微信jkxx123321 这是一篇关于LIstView实现动态数据渲染的文章![RN] 首先我们讲讲数据是如何来规划的 一般情况下我们有两种规划方案前提比如我们数据是100条+ ...

  2. Sqlserver精简安装选项

  3. Python:随机生成测试数据的模块--faker的基本使用

    本文内容: faker的介绍 faker的使用 小例子:生成随机的数据表信息 首发日期:2018-06-15 faker介绍: faker是python的一个第三方模块,是一个github上的开源项目 ...

  4. redis的一命令

    参考http://redisdoc.com/ 参考http://redis.io/commands 连接操作相关的命令 默认直接连接  远程连接-h 192.168.1.20 -p 6379 ping ...

  5. Vue延迟点击

    从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间 fastclick清除点击延迟,让程序更灵敏 1.导出fastclick import Vue from ...

  6. 关于数据库不适合docker的原因(摘抄)

    所有的服务都开始了容器化升级,在一切皆容器的主流思想下,无状态的服务采用容器化已经是大势所趋,常常困扰架构师的一个问题是,数据库是否需要容器化? 数据库不适合容器化的七大原因 1. 数据不安全 即使你 ...

  7. February 4th, 2018 Week 6th Sunday

    Hope clouds observation. 心怀希望会蒙蔽双眼,影响判断. Almost every of us thinks we would be the master of our liv ...

  8. Node.js webpack Vue-CLI --安装

    Node.js 安装 从官网 下载 安装 Node.js 官网 Node.js 官方文档 cmd 命令 node -v 查看版本号 v10.15.0 npm 包管理工具 npm 是JavaScript ...

  9. javascript获取指定区间范围随机数的方法

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code //获取指定区间范围随机数,包括lowerValue和upperValue funct ...

  10. nat表使用

    Net Address Translation 网络地址转换 IP地址 私网IP:nat技术将私网IP转换公网IP 公网IP: iptables nat表:三条链 主要用PREROUTING,POST ...