原文地址:→传送门

写在前面

在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. c# 修改pdf

    继续引用spire的dll. 1.代码如下: PdfDocument doc = new PdfDocument(); doc.LoadFromFile("wen.pdf"); P ...

  2. find . -name file -exec echo abc > {} \; fail

    find . -name file -exec echo abc > {} \; fail 应该改用: find . -name file -exec bash -c 'echo abc > ...

  3. JS高级 2

    递归:函数自己调用自己 在JavaScript中唯一能产生作用域的东西是 函数!js中只有函数可以创建作用域 词法作用域,也叫做静态作用域 //就是在代码写好的那一刻,变量和函数的作用域就已经确定了, ...

  4. 奇异值分解(SVD)原理详解及推导 (转载)

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有 ...

  5. oracle 行转列和列转行

    WITH L AS ( ), m AS ( SELECT A.LV AS LV_A, B.LV AS LV_B, TO_CHAR(B.LV) || 'x' || TO_CHAR(A.LV) || '= ...

  6. spring mvc4 找不到静态文件js/css/html 404

    说明: http://localhost:8080 指向的目录是WEB-INF所在的目录,也就是说请求静态资源时都是从该根目录开始查找.建议将所有静态文件放到和WEB-INF同级的目录下. 以 htt ...

  7. 【计算机基础】当你在浏览器中输入Google.com并且按下回车之后发生了什么?

    本文转载自:https://github.com/skyline75489/what-happens-when-zh_CN#id9 按下"g"键 接下来的内容介绍了物理键盘和系统中 ...

  8. 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

    前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...

  9. bzoj4032-最短不公共子串

    题意 给出两个长度小于等于2000的小写字母串,四个问题: A的最短子串不是B的子串 A的最短子串不是B的子序列 A的最短子序列不是B的子串 A的最短子序列不是B的子序列 分析 虽然求的是不公共,但是 ...

  10. C++解析(6):函数参数的扩展

    0.目录 1.函数参数的默认值 2.函数默认参数的规则 3.函数占位参数 4.小结 1.函数参数的默认值 C++可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值,则使用默认值 参数的 ...