原文地址:→传送门

写在前面

在HTML5之前,实现拖放功能需要借助mousedown/mousemove/mouseover/mouseout/mouseup等鼠标事件来完成,HTML5中拖放API的出现使很多事情变简单。下面是做笔记做笔记~

注:未来得及做兼容,请在chrome中打开。

拖放过程

  1. 拖放:包括拖拽(drag)和释放(drop)

  2. 拖放中涉及两个元素,分别是:源对象和目标对象,如下图

    源对象是被拖拽的元素,目标对象是要释放到的接收元素。

  3. 拖放事件:

拖放事件流为拖放操作开始后触发的一系列事件,分为以下两类:

发生在源对象上的事件

dragstart:用户开始拖动页面中的某个元素时触发的事件
drag: 源对象在拖拽过程中持续触发的事件
dragend:拖动完成时触发的事件,一般用于清空拖动过程中的状态等。

发生在目标对象上的事件

dragenter:源对象进入到目标对象时,会触发目标对象的ondragenter事件
dragleave:源对象移除之前调用了dragenter的元素时,目标元素触发的事件
dragover:源对象进入目标对象后持续触发的事件
drop:用户释放鼠标时,drop会在目标对象上被调用

4.设置元素可拖动

dragable = "true"

5.传输和控制--dataTransfer

dataTransfer对象可用于每个拖放事件中。用于获取和设置实际放置的数据,主要属性及方法如下:

setData(format,data):在dragstart事件中调用此函数可以注册一个MIME类型格式的传输项。
getData(format):可以获取指定类型的注册数据项。
types:属性以数组形式返回所有当前注册的格式。
items:返回所有项机器相关格式列表
files:返回与放置相关的所有文件
clearData():不带参则清空所有注册数据,带参则移除指定注册项
…………等等

来点儿小栗子

说小栗子前说下两点:

  • 触发dragover事件时,需要使用preventDefault()方法阻止默认事件,drag事件才能正常触发
  • dataTransfer中的files属性用到了File API规范的子集,files存放了文件列表,files支持下列属性:
name:带有扩展名的文件全名
type:文件的MIME类型
size:以字节为单位的文件大小
lastModifiedDate:最后一次修改文件内容的时间戳
  • 下面会用到的FileReader对象详细请移步

    FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

其中File对象可以是来自用户在一个元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果.

  1. 简单的节点拖放

    可将任意节点拖放到其他元素上,并插入到目标元素的前面

    拖放前后:

主要代码:

 /*目标对象上触发的dragove事件*/
drag.addEventListener('dragover', function (e) {
e.preventDefault(); //阻止默认动作
}) /*源对象释放,目标对象上触发的事件*/
drag.addEventListener('drop', function (e) {
ele.classList.remove('draging');
if (e.target.nodeName === 'LI') {
e.target.parentNode.insertBefore(ele, e.target); //将源对象元素插入到目标元素前面
}
})

2.节点清除

可将龙猫丢进垃圾桶,即清除img元素节点

丢龙猫前后:

主要代码:

<h3>拖动龙猫到垃圾桶后从DOM树中删除子元素</h3>
![](./img/default.png)
<hr/>
![](./img/01.jpeg)
![](./img/02.jpg)
![](./img/03.jpeg) <script> //为源对象添加事件监听 —— 记录拖动了哪一个源对象
var imgs = document.querySelectorAll('.imgs');
var target = document.querySelector('#bin'); for(var i=0; i<imgs.length; i++){
var pic = imgs[i];
pic.ondragstart = function(e){ //开始拖动源对象
e.dataTransfer.setData('imgID',this.id);//保存被拖拽源的id
}
} //为目标对象添加事件监听 —— 删除拖动的源对象
target.ondragover= function(e){
e.preventDefault(); //阻止默认行为
}
target.ondrop= function(e){ //源对象松手释放在了目标对象中
//删除被拖动的源对象
var id = e.dataTransfer.getData('imgID');
var p = document.getElementById(id);
p.parentNode.removeChild(p); //从父元素中删除子节点
} </script>
  1. 将本地图片拖放到页面中指定区域

    可将你的美图拖到网页中显示

    爆照前后效果:



    主要代码:
var content = document.querySelector('#content');

    document.addEventListener('dragover',function(e){
e.preventDefault(); //阻止document的默认事件
}); document.addEventListener('drop',function(e){
e.preventDefault(); //阻止document的默认事件(阻止照片在新窗口中打开)
}); content.addEventListener('dragover',function(e){
e.preventDefault();
}) content.addEventListener('drop',function(e){
var imgFs = e.dataTransfer.files[0]; //files存放了文件列表
//console.log(imgFs);
var fs = new FileReader(); //创建一个FileReader对象
fs.readAsDataURL(imgFs);
/*图片资源加载完成之后显示在content中*/
fs.onload = function(){
var img = new Image();
img.src = fs.result;
content.appendChild(img);
}
})

小结

对今天学习的知识点做个记录,欢迎大佬们指正~

拖放API中的drag和drop实战的更多相关文章

  1. 使用 Drag and Drop 给Web应用提升交互体验

    什么是 Drag and Drop (拖放)? 简单来说,HTML5 提供了 Drag and Drop API,允许用户用鼠标选中一个可拖动元素,移动鼠标拖放到一个可放置到元素的过程. 我相信每个人 ...

  2. HTML5_06之拖放API、Worker线程、Storage存储

    1.拖放API中源对象与目标对象事件间的数据传递: ①创建全局变量--污染全局对象:  var 全局变量=null;  src.ondragstart=function(){   全局变量=数据值;  ...

  3. angularjs drag and drop

    angular-dragula Drag and drop so simple it hurts 480 live demo angular-drag-and-drop-lists Angular d ...

  4. HTML5 拖放(Drag 和 Drop)功能开发——基础实战

    随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下. 简介 拖拽(Drag/Drop)是个非常普遍的 ...

  5. Android开发者指南-用户界面-拖放-Drag and Drop[原创译文]

      英文原文:http://developer.android.com/guide/topics/ui/drag-drop.html 版本:Android 4.0 r1 译者注:黄色底色为未决译文 快 ...

  6. HTML5 拖放(Drag 和 Drop)详解与实例

    简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...

  7. HTML5 拖放(Drag 和 Drop)详解与实例(转)

    公司要开一个技术分享会,给我们出了几个简单的题去实现,其中有如何实现表格中列之间的拖拽,我知道html5中有个新方法可以实现,但是没有认真学习,现在闲了去学学,发现关于drag和drop的文章有很多, ...

  8. HTML5 之拖放(drag与drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...

  9. Android 用户界面---拖放(Drag and Drop)(三)

      设计拖放操作 本节主要内容如下: 1.  如何开始拖拽: 2.  在拖拽期间如何响应事件: 3.  如何响应落下事件: 4.  如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...

随机推荐

  1. 福大软工1816:Beta(2/7)

    Beta 冲刺 (2/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 为utils_wxpy.py添加注释 ...

  2. 静默调用ShellContextMenu 实现QQ文件共享

    我在CSDN提问题一直没人回复,一下午时间自己终于解决了问题 http://bbs.csdn.net/topics/391916381 现将过程录下 先说需求,我想实现的功能是 在程序中对文件调用百度 ...

  3. 项目Beta冲刺(团队)第一天

    1.今天解决的进度 成员 进度 陈家权 回复界面设计,由于成员变动加上和其他成员距离较远,服务器404 赖晓连 改进Alpha版本页面没能及时更新的问题 雷晶 获取提问问题时间更新到数据库 林巧娜 今 ...

  4. mui.ajax与服务器(SpringMVC)传输json数据

    跨域问题 PC端为了安全,所以禁止跨域.而我使用mui做移动web时,难免会使用pc浏览器进行调试.mui.ajax是允许跨域的.为了可以调试成功,需要对浏览器进行设置及.以360急速浏览器为例,设置 ...

  5. 软工网络15团队作业4-DAY8

    每日例会 昨天的工作. 张陈东芳:可导入部分类信息,继续尝试将所有信息导入: 吴敏烽:商品类的规范化编写: 周汉麟:界面的排版继续优化: 林振斌:按照浏览历史,次数等,继续优化商品类排序: 李智:研究 ...

  6. 【leetcode】215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  7. 【week11】psp

    本周psp 项目 内容 开始时间 结束时间 被打断 净时间 11.26(星期六)  看论文 psiBlast  9:00 12:00  5  175    11.28(星期一)  做作业 设计模式作业 ...

  8. PAT 甲级 1035 Password

    https://pintia.cn/problem-sets/994805342720868352/problems/994805454989803520 To prepare for PAT, th ...

  9. Node.js系列——(3)连接DB

    背景 node.js,有人称之为运行在服务器端的JavaScript.以往我们使用JavaScript时,都是依赖后端查询数据库并返回数据,而JavaScript只需要展示即可.问题来了,就不能绕开后 ...

  10. CentOS下php安装mcrypt扩展

    CentOS下php安装mcrypt扩展 Posted on 2012-09-12 15:27 C'est la vie 阅读(48294) 评论(3) 编辑 收藏 (以下步骤均为本人实际操作,可能与 ...