拖放API中的drag和drop实战
原文地址:→传送门
写在前面
在HTML5之前,实现拖放功能需要借助mousedown/mousemove/mouseover/mouseout/mouseup等鼠标事件来完成,HTML5中拖放API的出现使很多事情变简单。下面是做笔记做笔记~
注:未来得及做兼容,请在chrome中打开。
拖放过程
拖放:包括拖拽(drag)和释放(drop)
拖放中涉及两个元素,分别是:源对象和目标对象,如下图
源对象是被拖拽的元素,目标对象是要释放到的接收元素。

拖放事件:

拖放事件流为拖放操作开始后触发的一系列事件,分为以下两类:
发生在源对象上的事件
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()方法后返回结果.
- 简单的节点拖放
可将任意节点拖放到其他元素上,并插入到目标元素的前面
拖放前后:

 
主要代码:
 /*目标对象上触发的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>
      
      <hr/>
      
      
        
      <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>
- 将本地图片拖放到页面中指定区域
可将你的美图拖到网页中显示
爆照前后效果:

主要代码: 
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实战的更多相关文章
- 使用 Drag and Drop 给Web应用提升交互体验
		
什么是 Drag and Drop (拖放)? 简单来说,HTML5 提供了 Drag and Drop API,允许用户用鼠标选中一个可拖动元素,移动鼠标拖放到一个可放置到元素的过程. 我相信每个人 ...
 - HTML5_06之拖放API、Worker线程、Storage存储
		
1.拖放API中源对象与目标对象事件间的数据传递: ①创建全局变量--污染全局对象: var 全局变量=null; src.ondragstart=function(){ 全局变量=数据值; ...
 - angularjs drag and drop
		
angular-dragula Drag and drop so simple it hurts 480 live demo angular-drag-and-drop-lists Angular d ...
 - HTML5 拖放(Drag 和 Drop)功能开发——基础实战
		
随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下. 简介 拖拽(Drag/Drop)是个非常普遍的 ...
 - Android开发者指南-用户界面-拖放-Drag and Drop[原创译文]
		
英文原文:http://developer.android.com/guide/topics/ui/drag-drop.html 版本:Android 4.0 r1 译者注:黄色底色为未决译文 快 ...
 - HTML5 拖放(Drag 和 Drop)详解与实例
		
简介 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 先点击一个小例子:在用户开始拖动 <p> 元素时执行 JavaSc ...
 - HTML5 拖放(Drag 和 Drop)详解与实例(转)
		
公司要开一个技术分享会,给我们出了几个简单的题去实现,其中有如何实现表格中列之间的拖拽,我知道html5中有个新方法可以实现,但是没有认真学习,现在闲了去学学,发现关于drag和drop的文章有很多, ...
 - HTML5 之拖放(drag与drop)
		
拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...
 - Android 用户界面---拖放(Drag and Drop)(三)
		
设计拖放操作 本节主要内容如下: 1. 如何开始拖拽: 2. 在拖拽期间如何响应事件: 3. 如何响应落下事件: 4. 如何结束拖放操作. 开始拖拽 用户使用一个拖拽手势开始拖拽,通常是在 ...
 
随机推荐
- 第二次作业——个人项目实战(sudoku)
			
第二次作业--个人项目实战(sudoku) 一.作业要求地址 第二次作业--个人项目实战 二.Github项目地址 softengineering1--sudoku 三.PSP表格估计耗时 PSP2. ...
 - this & super
			
/* 当本类的成员和局部变量同名用this区分. 当子父类中的成员变量同名用super区分父类. this和super的用法很相似. this:代表一个本类对象的引用. super:代表一个父 ...
 - C语言文法翻译
			
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
 - UML之Enterprise Architect使用
			
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:UML之Enterprise Architect使用 本文地址:http://tech ...
 - PHP中普通属性和静态属性
			
普通属性(实例属性): 实例的单词为:instance 实例,其实也叫做“对象”: 普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性! 定义形式: class 类名{ var $属性 ...
 - Mysql中的索引
			
索引 什么是索引? 索引是系统内部自动维护的隐藏的“数据表”,它的作用是,可以极大地加快数据的查找速度! 这个隐藏的数据表,其中的数据是自动排好序的,其查找速度就是建立在这个基础上. 通常,所谓建立索 ...
 - break,continue,return 的区别
			
(1)break 跳出当前循环体 (2)continue 跳过当前循环体continue后面的代码,继续执行下一个循环 (3)return 和循环没关系,就是跳出该函数
 - 如何让TEdit在获取输入焦点后selectAll?
			
关于网友提出的“ 如何让TEdit在获取输入焦点后selectAll?”问题疑问,本网通过在网上对“ 如何让TEdit在获取输入焦点后selectAll?”有关的相关答案进行了整理,供用户进行参考,详 ...
 - hadoop跑第一个实例过程
			
第一次跑hadoop实例,中间经过了不少弯路,特此记录下来: 第一步:建立一个maven过程,pom.xml文件:(打包为jar包) <dependency> <groupId> ...
 - CF486D-Valid Sets
			
题目 给出一个\(n\)个点的树,每个点有权值\(a_i\),再给出一个\(d\),问有多少个非空点集满足: 点集在树上构成联通子图 \[\max _{v\in S}a_v -\min _{v\in ...
 
			
		

