HTML5--拖拽API(含超经典例子)

一、关于拖拽API

拖拽API是HTML5的新特性,相对于其他新特性来说,重要程度占到6成,实际开发中使用比例占到3成,学习要求个人认为是达到掌握即可的程度。

二、什么是拖拽和释放?

拖拽:Drag

释放:Drop

拖拽指的是鼠标点击源对象后一直移动对象不松手,一但松手即释放了

三、什么是源对象和目标对象?



源对象:指的是我们鼠标点击的一个事物,这里可以是一张图片,一个DIV,一段文本等等。

目标对象:指的是我们拖动源对象后移动到一块区域,源对象可以进入这个区域,可以在这个区域上方悬停(未松手),可以释松手释放将源对象放置此处(已松手),也可以悬停后离开该区域。

四、拖拽API的相关函数

解释了什么是源对象和目标对象后,回归前端中的拖拽API,由上面的操作我们可以得出几个函数

被拖动的源对象可以触发的事件:

(1)ondragstart:源对象开始被拖动

(2)ondrag:源对象被拖动过程中(鼠标可能在移动也可能未移动)

(3)ondragend:源对象被拖动结束

  拖动源对象可以进入到上方的目标对象可以触发的事件:

(1)ondragenter:目标对象被源对象拖动着进入

(2)ondragover:目标对象被源对象拖动着悬停在上方

(3)ondragleave:源对象拖动着离开了目标对象

(4)ondrop:源对象拖动着在目标对象上方释放/松手


拖拽API总共就是7个函数!!


五、如何在拖动的源对象事件和目标对象事件间传递数据

  

HTML5为所有的拖动相关事件提供了一个新的属性:

e.dataTransfer { }          //数据传递对象

  功能:用于在源对象和目标对象的事件间传递数据

  

源对象上的事件处理中保存数据:

e.dataTransfer.setData( k,  v );     //k-v必须都是string类型

  

目标对象上的事件处理中读取数据:

var v = e.dataTransfer.getData( k );




示例一:实现一个可以随着鼠标拖动而移动的小飞机

提示:飞机需要绝对定位!ondrag事件中获取鼠标的坐标值!!!



代码如下:

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.     <meta charset="UTF-8">  
  5.     <title></title>  
  6.     <style>  
  7.         body{  
  8.             margin:0;  
  9.             position: relative;  
  10.         }  
  11.         img{  
  12.             position:absolute;  
  13.         }  
  14.     </style>  
  15. </head>  
  16. <body>  
  17. <h3>随着鼠标拖动而移动的小飞机</h3>  
  18. <img id="p3" src="img/p3.png" alt=""/>  
  19. <script>  
  20.     p3.ondragstart=function(e){  
  21.         console.log('事件源p3开始拖动');  
  22.         //记录刚一拖动时,鼠标在飞机上的偏移量  
  23.         offsetXe.offsetX;  
  24.         offsetYe.offsetY;  
  25.     }  
  26.     p3.ondrag=function(e){  
  27.         console.log('事件源p3拖动中');  
  28.         var xe.pageX;  
  29.         var ye.pageY;  
  30.         console.log(x+'-'+y);  
  31.         //drag事件最后一刻,无法读取鼠标的坐标,pageX和pageY都变为0  
  32.         if(x==0 && y==0){  
  33.             return; //不处理拖动最后一刻X和Y都为0的情形  
  34.         }  
  35.         x-=offsetX;  
  36.         y-=offsetY;  
  37.   
  38.         p3.style.left=x+'px';  
  39.         p3.style.top=y+'px';  
  40.     }  
  41.     p3.ondragend=function(){  
  42.         console.log('源对象p3拖动结束');  
  43.     }  
  44. </script>  
  45. </body>  
  46. </html>  

效果如下:





示例二:

模拟电脑中 ”垃圾桶“的效果, 总共显示三个小飞机,拖动着某个小飞机到垃圾桶上方后,小飞机从DOM树上删除


提示:删除需要从DOM子节点中删除元素,需要阻止ondragover的默认行为!!利用源对象和目标对象的数据传递记录小飞机的ID值!!!


重要信息:

ondragover有一个默认行为!!!那就是当ondragover触发时,ondrop会失效!!!!这个可能是浏览器的版本问题,需要以后浏览器不断更新可能才会解决!!


如何阻止?

ondragover= function(e){  //源对象在悬停在目标对象上时
  e.preventDefault();  //阻止默认行为,使得drop可以触发
	.....
}
ondrop= function(e){  //源对象松手释放在了目标对象中
	.....
}




代码如下:

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.   <meta charset="UTF-8">  
  5.   <title></title>  
  6.   <style>  
  7.     body {  
  8.       text-align: center;  
  9.     }  
  10.     #trash {  
  11.       opacity: .2;  
  12.       margin: 15px;  
  13.     }  
  14.   </style>  
  15. </head>  
  16. <body>  
  17.   <h3>拖动飞机到垃圾桶后从DOM树中删除子元素</h3>  
  18.   <img id="trash" src="img/trash_full.png">  
  19.   <hr/>  
  20.   <img id="p3" class="src" src="img/p3.png">  
  21.   <img id="p4" class="src" src="img/p4.png">  
  22.   <img id="p5" class="src" src="img/p5.png">  
  23.   
  24.   <script>  
  25.   
  26.     //为源对象添加事件监听 —— 记录拖动了哪一个源对象  
  27.     var srcList = document.querySelectorAll('.src');//找到全部img元素  
  28.     for(var i=0; i<srcList.length; i++){ //遍历img元素  
  29.       var p = srcList[i];  
  30.       p.ondragstart = function(e){ //开始拖动源对象  
  31.         e.dataTransfer.setData('PlaneID',this.id);//保存数据--该img元素的id  
  32.       }  
  33.       p.ondrag = function(){}  
  34.       p.ondragend = function(){}  
  35.     }  
  36.   
  37.     //为目标对象添加事件监听 —— 删除拖动的源对象  
  38.     trash.ondragenter = function(){ //源对象进入目标对象  
  39.       console.log('drag enter');  
  40.       trash.style.opacity = "1"; //将透明度变成1  
  41.     }  
  42.     trash.ondragleavefunction(){  //源对象离开目标对象后  
  43.       console.log('drag leave');  
  44.       trash.style.opacity = ".2"; //将透明度变为0.2  
  45.     }  
  46.     trash.ondragoverfunction(e){  //源对象在悬停在目标对象上时  
  47.       e.preventDefault();  //阻止默认行为,使得drop可以触发  
  48.     }  
  49.     trash.ondropfunction(e){ //源对象松手释放在了目标对象中  
  50.       console.log('drop');  
  51.       trash.style.opacity = ".2"; //将透明度变为0.2  
  52.       //删除被拖动的源对象  
  53.       var id = e.dataTransfer.getData('PlaneID');//得到数据--id值  
  54.       var p = document.getElementById(id); //根据id值找到相关的元素  
  55.       p.parentNode.removeChild(p);  //从父元素中删除子节点  
  56.     }  
  57.   
  58.   
  59.   </script>  
  60. </body>  
  61. </html>  

效果如下:



拖拽小飞机到垃圾桶删除后:


如图,原本三架小飞机,现在变成了两架!!!


六、拖拽API的补充知识点!!(重要,面试中也许会问到噢!!)

面试题:

如何在网页中显示客户端(电脑)的一张图片?

如何拖动客户端的网页显示在服务器端下载的页面中?


这两个问题是什么意思呢?

我们平时在电脑中拖拽一张图片到浏览器中实现的下载操作!!!按照H5之前的标准,要实现直接拖拽一张图片到浏览器中显示是无法完成!!但是自从H5新特性出来之后增加了拖拽API的特性,完美的实现了这一功能!!!


应用场合:

在某网站上,上传图片当做是头像

上传相片...



HTML5新增的文件操作对象:

File: 代表一个文件对象

FileList: 代表一个文件列表对象,类数组

FileReader:用于从文件中读取数据

FileWriter:用于向文件中写出数据


相关函数:

div.ondrop = function(e){

var f = e.dataTransfer.files[0];      //找到拖放的文件

var fr = new FileReader();        //创建文件读取器

fr.readAsURLData(f);         //读取文件内容

fr.onload = function(){       //读取完成

img.src = fr.result;        //使用读取到的数据

}

 }


代码如下:

[html]  view plain  copy
  1. <span style="font-size:18px;"><!DOCTYPE html>  
  2. <html>  
  3. <head lang="en">  
  4.   <meta charset="UTF-8">  
  5.   <title></title>  
  6.   <style>  
  7.     #container {  
  8.       border: 1px solid #aaa;  
  9.       border-radius: 3px;  
  10.       padding: 10px;  
  11.       margin: 10px;  
  12.       min-height: 400px;  
  13.     }  
  14.   </style>  
  15. </head>  
  16. <body>  
  17.   
  18.   <h1>拖放API的扩展知识</h1>  
  19.   <h3>请拖动您的照片到下方方框区域</h3>  
  20.   <div id="container"></div>  
  21.   
  22.   <script>  
  23.     //监听document的drop事件——取消其默认行为:在新窗口中打开图片  
  24.     document.ondragover = function(e){  
  25.       e.preventDefault(); //使得drop事件可以触发  
  26.     }  
  27.     document.ondrop = function(e){  
  28.       e.preventDefault(); //阻止在新窗口中打开图片,否则仍然会执行下载操作!!!  
  29.     }  
  30.   
  31.     //监听div#container的drop事件,设法读取到释放的图片数据,显示出来  
  32.     container.ondragover = function(e){  
  33.       e.preventDefault();  
  34.     }  
  35.     container.ondrop = function(e){  
  36.       console.log('客户端拖动着一张图片释放了...')  
  37.       //当前的目标对象读取拖放源对象存储的数据  
  38.       //console.log(e.dataTransfer); //显示有问题  
  39.       //console.log(e.dataTransfer.files.length); //拖进来的图片的数量  
  40.       var f0 = e.dataTransfer.files[0];  
  41.       //console.log(f0); //文件对象 File  
  42.   
  43.       //从文件对象中读取数据  
  44.       var fr = new FileReader();  
  45.       //fr.readAsText(f0); //从文件中读取文本字符串  
  46.       fr.readAsDataURL(f0); //从文件中读取URL数据  
  47.       fr.onload = function(){  
  48.         console.log('读取文件完成')  
  49.         console.log(fr.result);  
  50.         var img = new Image();  
  51.         img.src = fr.result; //URL数据  
  52.         container.appendChild(img);  
  53.       }  
  54.     }  
  55.   
  56.   </script>  
  57. </body>  
  58. </html></span>  


效果如下:





从电脑中拖拽一张图片到浏览器中显示:



如图,客户端(电脑)中的图片完美在浏览器中显示!!!
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值