1、拖放(Drag 和 drop)是 HTML5 标准的组成部分。
拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。
浏览器支持:Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放(注:在 Safari 5.1.2 中不支持拖放)。
2、相关属性及方法
设置元素为可拖放,把 draggable 属性设置为 true
1 | <label class = "move" draggable= "true" id= "index1" >index1</label> |
设置元素被拖动时触发的事件 ondragstart
1 | <label class = "move" draggable= "true" ondragstart= "drag(event)" id= "index1" >index1</label> |
放到何处 - ondragover ,以div 为例:
1 | <div id= "right" ondragover= "dragover(event)" >...</div> |
进行放置 - ondrop,以div 为例:
1 | <div id= "right" ondragover= "dragover(event)" ondrop= "drop(event)" >...</div> |
3、实现一个简单的 从左向右拖动元素,从右向左拖动元素,比较简陋。
![](http://www.html5cn.org/data/attachment/portal/201609/23/083057clu3v33z4rcvoluv.png)
![](http://www.html5cn.org/data/attachment/portal/201609/23/083057u4r00mbh5pfvvhhf.png)
html:
拖动元素的方法,未在元素上进行绑定,均在 js 里进行绑定
03 | <label class = "move" draggable= "true" id= "index1" >index1</label> |
04 | <label class = "move" draggable= "true" id= "index2" >index2</label> |
05 | <label class = "move" draggable= "true" id= "index3" >index3</label> |
06 | <label class = "move" draggable= "true" id= "index4" >index4</label> |
07 | <label class = "move" draggable= "true" id= "index5" >index5</label> |
08 | <label class = "move" draggable= "true" id= "index6" >index6</label> |
09 | <label class = "move" draggable= "true" id= "index7" >index7</label> |
javascript:
动态给 label元素 加上被拖动事件
1 | var len = document.getElementsByClassName( 'move' ).length; |
2 | for ( var i = 0; i < len; i++) { |
3 | document.getElementsByClassName( 'move' ).item(i).ondragstart = function (ev) { |
5 | ev.dataTransfer.setData( "Text" , ev.target.id); |
设置左边-〉右边拖动
01 | document.getElementById( 'right' ).ondragover = function (ev) { |
03 | if (ev.target.id == 'right' ) { |
08 | document.getElementById( 'right' ).ondrop = function (ev) { |
10 | var id = ev.dataTransfer.getData( 'Text' ); |
11 | if (document.getElementById(id).parentElement.id == 'left' ) { |
12 | ev.target.appendChild(document.getElementById(id)); |
设置右边-〉左边拖动
01 | document.getElementById( 'left' ).ondragover = function (ev) { |
03 | if (ev.target.id == 'left' ) { |
07 | document.getElementById( 'left' ).ondrop = function (ev) { |
09 | var id = ev.dataTransfer.getData( 'Text' ); |
10 | if (document.getElementById(id).parentElement.id == 'right' ) { |
11 | ev.target.appendChild(document.getElementById(id)); |
代码解释:
- ondragover 默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。
- 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
- 通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
源代码:
04 | 4 <meta charset= "UTF-8" > |
07 | 7 #left,#right,#center{ |
09 | 9 border:1px solid #ccc; |
12 | 12 text-align: center; |
13 | 13 margin-left: 100px; |
17 | 17 #left label,#right label{ |
27 | 27 <h2><mark>拖放(Drag 和 drop)</mark></h2> |
30 | 30 <label class = "move" draggable= "true" id= "index1" >index1</label> |
31 | 31 <label class = "move" draggable= "true" id= "index2" >index2</label> |
32 | 32 <label class = "move" draggable= "true" id= "index3" >index3</label> |
33 | 33 <label class = "move" draggable= "true" id= "index4" >index4</label> |
34 | 34 <label class = "move" draggable= "true" id= "index5" >index5</label> |
35 | 35 <label class = "move" draggable= "true" id= "index6" >index6</label> |
36 | 36 <label class = "move" draggable= "true" id= "index7" >index7</label> |
42 | 42 $(document).ready( function () { |
43 | 43 var len = document.getElementsByClassName( 'move' ).length; |
44 | 44 for ( var i = 0; i < len; i++) { |
45 | 45 document.getElementsByClassName( 'move' ).item(i).ondragstart = function (ev) { |
47 | 47 ev.dataTransfer.setData( "Text" , ev.target.id); |
53 | 53 document.getElementById( 'right' ).ondragover = function (ev) { |
55 | 55 if (ev.target.id == 'right' ) { |
56 | 56 ev.preventDefault(); |
59 | 59 document.getElementById( 'right' ).ondrop = function (ev) { |
60 | 60 ev.preventDefault(); |
61 | 61 var id = ev.dataTransfer.getData( 'Text' ); |
62 | 62 if (document.getElementById(id).parentElement.id == 'left' ) { |
63 | 63 ev.target.appendChild(document.getElementById(id)); |
69 | 69 document.getElementById( 'left' ).ondragover = function (ev) { |
71 | 71 if (ev.target.id == 'left' ) { |
72 | 72 ev.preventDefault(); |
75 | 75 document.getElementById( 'left' ).ondrop = function (ev) { |
76 | 76 ev.preventDefault(); |
77 | 77 var id = ev.dataTransfer.getData( 'Text' ); |
78 | 78 if (document.getElementById(id).parentElement.id == 'right' ) { |
79 | 79 ev.target.appendChild(document.getElementById(id)); |