首页 > 代码库 > HTML5拖放

HTML5拖放

  拖放(drag和drop)是html5标准组成,下面我们从五个方面对其进行叙述,分别是如何成为拖动物体,如何成为拖动目标,拖动物体上拥有的事件,拖动目标上拥有的事件以及拖放物体间如何传递信息。

拖动物体上拥有的事件

  1. dragstart (在物体刚被拖动时触发)
  2. drag (在dragstart事件触发之后就被触发)
  3. dragend (拖动事件结束时触发)

拖动目标上拥有的事件

  1. dragenter (当拖拽元素进入放置目标时触发)
  2. dragover (当拖拽元素在放置目标中移动时触发,类似于mouseover)
  3. drop (当拖拽元素放置在放置目标中时触发)

如何成为拖动物体

在html中img元素默认可以进行拖拽,其它元素需要设置draggable=true,即可对其进行拖拽。

 1 <div draggable="true"></div>

如何成为拖动目标

html中,元素默认不能成为放置目标,只有我们禁止了drapenter和drapover事件的默认行为时,可以称为拖放目标。

1 droptarget.addEventListener(‘dragenter‘, function(event) {
2     event.preventDefault();
3 });
4 droptarget.addEventListener(‘dragover‘, function(event) {
5     event.preventDefault();
6 });

拖放物体间如何传递信息

事件中具有一个dataTransfer对象,它拥有的两个常用方法setData()和getData(),分别用于在存放拖拽信息以及获取拖拽信息。其中,setData()只能在拖拽事件刚开始时设置,即dragstart事件时设置,getData()则一般在放置获取,即drop事件触发时获取。

 1 // drapobj 拖拽元素
 2 // droptarget 放置目标
 3 dragobj.addEventListener(‘dragstart‘, function(event) {
 4     event.dataTransfer.setData(‘id‘, dragobj.id);
 5 });
 6 droptarget.addEventListener(‘drop‘, function(event) {
 7     var id = event.dataTransfer.getData(‘id‘);
 8     var obj = document.getElementById(id);
 9     event.preventDefault();
10     this.appendChild(obj);
11 });

 完整代码

技术分享
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>HTML5 拖拽</title>
 7 </head>
 8 
 9 <body>
10     <div draggable="true"></div>
11     <div style="height: 150px" id="dragobj" draggable="true">
12         <img src="c_06.jpg" alt="">
13     </div>
14     <div id="droptarget" style="width: 150px; height: 150px;background-color: #eee;"></div>
15 </body>
16 <script>
17 var droptarget = document.getElementById(droptarget);
18 var dragobj = document.getElementById(dragobj);
19 
20 // drapobj 拖拽元素
21 // droptarget 放置目标
22 dragobj.addEventListener(dragstart, function(event) {
23     event.dataTransfer.setData(id, dragobj.id);
24 });
25 droptarget.addEventListener(dragenter, function(event) {
26     event.preventDefault();
27 });
28 droptarget.addEventListener(dragover, function(event) {
29     event.preventDefault();
30 });
31 droptarget.addEventListener(drop, function(event) {
32     var id = event.dataTransfer.getData(id);
33     var obj = document.getElementById(id);
34     event.preventDefault();
35     this.appendChild(obj);
36 });
37 </script>
38 
39 </html>
View Code

存在问题

火狐浏览器中拖拽图片默认打开新窗口,根据javascript高级程序设计中在drop事件中禁止默认事件,未解决问题。

解决方法:将图片作为div的背景图片,将div作为拖拽物体,则不存在此问题。

最终代码

技术分享
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>HTML5 拖拽</title>
 7     <style>
 8     div {
 9         width: 120px;
10         height: 136px;
11     }
12     
13     #dragobj {
14         background: url(‘c_06.jpg‘) no-repeat;
15     }
16     
17     #droptarget {
18         background-color: #eee;
19     }
20     </style>
21 </head>
22 
23 <body>
24     <div id="dragobj" draggable="true">
25     </div>
26     <div id="droptarget"></div>
27 </body>
28 <script>
29 var droptarget = document.getElementById(droptarget);
30 var dragobj = document.getElementById(dragobj);
31 
32 // drapobj 拖拽元素
33 // droptarget 放置目标
34 dragobj.addEventListener(dragstart, function(event) {
35     event.dataTransfer.setData(id, dragobj.id);
36 });
37 droptarget.addEventListener(dragenter, function(event) {
38     event.preventDefault();
39 });
40 droptarget.addEventListener(dragover, function(event) {
41     event.preventDefault();
42 });
43 droptarget.addEventListener(drop, function(event) {
44     var id = event.dataTransfer.getData(id);
45     var obj = document.getElementById(id);
46     event.preventDefault();
47     this.appendChild(obj);
48 });
49 </script>
50 
51 </html>
View Code

HTML5拖放