html5 拖拽

若实现拖拽(火狐以外),被拖拽元素需添加属性:draggable

draggable是一个枚举属性,用于指定一个标签是否可以被拖拽。有以下四种取值:

true表示此元素可拖拽
false表示此元素不可拖拽
autoimg和带href的标签a标签表示可拖拽外,其它标签均表示不可拖拽
其它任何值表示不可拖拽

例一:(除火狐以外的现代浏览器中均可以拖拽)

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <meta charset="utf-8" />  
  5.     <title></title>  
  6.     <style>  
  7.         * {padding:0;margin:0}  
  8.         #oDiv1 { width:100px;height:100px;background-color:#c50000}  
  9.         #oDiv2 { width:200px;height:100px;background-color:#ffd800;position:absolute;top:300px;left:300px;}  
  10.     </style>  
  11. </head>  
  12. <body>  
  13.     <div id="oDiv1" draggable="true"></div>  
  14. </body>  
  15. </html>  

若想火狐下也同样实现拖拽,需要设置dataTransfer对象的setData()方法:

例二:(现代浏览器中均可以拖拽)

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html>  
  2. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <meta charset="utf-8" />  
  5.     <title></title>  
  6.     <style>  
  7.         * {padding:0;margin:0}  
  8.         #oDiv1 { width:100px;height:100px;background-color:#c50000}  
  9.         #oDiv2 { width:200px;height:100px;background-color:#ffd800;position:absolute;top:300px;left:300px;}  
  10.     </style>  
  11. </head>  
  12. <body>  
  13.     <div id="oDiv1" draggable="true"></div>  
  14.     <div id="oDiv2"></div>  
  15.     <script>  
  16.         var oDiv1 = document.getElementById("oDiv1");  
  17.         var oDiv2 = document.getElementById("oDiv2");  
  18.         oDiv1.ondragstart = function (e) {  
  19.             var e = e || window.event;  
  20.             e.dataTransfer.setData(" ", " ");   //这里的两个参数均包含一个空格,后面会介绍dataTransfer  
  21.         }  
  22.     </script>  
  23. </body>  
  24. </html>  

事件:

【被拖拽元素】

ondragstart拖拽前触发(鼠标按下并开始拖拽)
ondrag           拖拽过程中触发(连续出发,即使鼠标不移动也会连续触发)
ondragend     拖拽结束触发

【目标元素】

ondragenter  进入目标元素
ondragover   
ondrop释放鼠标瞬间触发
ondragleave  鼠标离开目标元素触发

整个拖拽过程事件顺序:

ondragstart   — ondrag — ondragenter — ondragover — ondragleave/ondrop — ondragend  

注:1.  若想触发ondrop事件,ondragover 中需要阻止默认事件(元素默认是不允许放置的)。

      2.  在Firefox 3.5+中,如果是把图像拖放到放置目标上,页面就会转向图像文件;而如果是把文本拖放到放置目标上,则会导致无效URL错误,因此,为了让Firefox支持正常的拖放,还要取消drop事件的默认行为,阻止它打开URL。

关于event.dataTransfer

setData(key,value)两个参数都是字符串类型
getData(key)getData()可以取得由setData()保存的值
effectAllowed设置光标样式(none, copy, copyLink, copyMove, link, linkMove, move, all 和 uninitialized)  ;事件 ondragstart中设置
setDragImage(element, x, y)指定一副图像,当拖动发生时,显示在光标下方。这个方法接受的三个参数分别是要显示的HTML元素和光标在图像中的x、y坐标。其中,HTML元素(可以是隐藏的元素)可以是一副图像,也可以是其它元素。是图像则显示图像,是其它元素则显示渲染后的元素。实现这个方法的浏览器有Firefox 3.5+、Safari 4+ 和 Chorme
files  获取外部拖拽文件的一个类似数组的集合(length)。集合中每个元素有type属性,依次判断拖拽的文件类型。实现这个属性的浏览器有IE10+、Firefox 3.5+和Chrome。
注:只能在拖放事件的事件处理程序中访问dataTransfer对象。

       保存在dataTransfer对象中的数据只能在【目标元素】事件处理程序中读取。

关于FileReader(读取文件信息)

readAsDataURL        
参数为要读取的文件对象,将文件读取为DataUrl
onLoad                          
 读取成功完成时触发此事件,this.result 获取读取的文件数据,如果是图片,将返回base64格式的图片数据

例:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var fd=new FileReader();  
  2. fd.readAsDataURL(fs[0]);  //fs为event.dataTransfer.files获得的集合  
  3. fd.onLoad=function(){  
  4.    alert(this.result)  
  5. }  

一个完整的实例(拖拽上传预览):

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE HTML>    
  2. <html>    
  3. <head>    
  4. <style>    
  5.     *       { padding:0px;margin:0px;}    
  6.     #oDiv1  {width:300px;height:300px;border:1px solid #000;}    
  7. </style>    
  8. </head>    
  9. <body>    
  10.     <div id="oDiv1"></div>    
  11.     <script>  
  12.         var oDiv1 = document.getElementById("oDiv1");  
  13.         var oDiv2 = document.getElementById("oDiv2");  
  14.   
  15.         oDiv1.ondragenter = function (ev) {  
  16.             this.style.borderStyle = "dashed";  
  17.         }  
  18.         oDiv1.ondrop = function (ev) {  
  19.             var files = ev.dataTransfer.files;  
  20.             for (var i = 0, f; f = files[i]; i++) {  
  21.                 var reader = new FileReader();  
  22.                 reader.onload = (function (f) {  
  23.                     return function () {  
  24.                         oDiv1.innerHTML = '<img src="' + this.result + '" title="' + f.name + '" width="100%"  />';  
  25.                     }  
  26.                 })(f)  
  27.                 //(function(f){reader.onload = function (ev) {    
  28.                 //    oDiv1.innerHTML = '<img src="' + ev.target.result + '" title="' + f.name + '" width="100%" height="100%" />';    
  29.                 //}})(f)    
  30.                 reader.readAsDataURL(f);  
  31.             }  
  32.             this.style.borderStyle = "solid";  
  33.             ev.stopPropagation();  
  34.             ev.preventDefault();  
  35.         }  
  36.         oDiv1.ondragover = function (ev) {  
  37.             ev.stopPropagation();  
  38.             ev.preventDefault();  
  39.         }  
  40.         oDiv1.ondragleave = function (ev) {  
  41.             this.style.borderStyle = "solid";  
  42.         }  
  43.     </script>    
  44. </body>    
  45. </html>    


参考:http://www.w3cmm.com/html/drag.html

原文地址:http://blog.csdn.net/hdchangchang/article/details/17753623

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML5拖拽功能可以通过JavaScript来实现。下面是一个简单的示例,可以用来制作一个简单的点菜单: HTML代码: ```html <div id="menu"> <div class="item" draggable="true" ondragstart="drag(event)">Item 1</div> <div class="item" draggable="true" ondragstart="drag(event)">Item 2</div> <div class="item" draggable="true" ondragstart="drag(event)">Item 3</div> </div> <div id="cart" ondrop="drop(event)" ondragover="allowDrop(event)"> <h2>Cart</h2> </div> ``` JavaScript代码: ```javascript function allowDrop(event) { event.preventDefault(); } function drag(event) { event.dataTransfer.setData("text", event.target.id); } function drop(event) { event.preventDefault(); var data = event.dataTransfer.getData("text"); var item = document.getElementById(data); var cart = document.getElementById("cart"); cart.appendChild(item); } ``` 在上面的示例中,我们创建了两个div元素,一个用于菜单,一个用于购物车。我们还为菜单项添加了一个属性“draggable”,并为其添加了一个事件处理程序“ondragstart”,该事件处理程序将数据存储在数据传输对象中。 在购物车div上,我们还添加了两个事件处理程序:“ondrop”和“ondragover”,它们分别用于处理拖放事件和允许元素拖放到该元素上。 最后,我们还定义了三个函数:allowDrop(允许放置),drag(拖动)和drop(放置)。这些函数分别处理拖动操作和放置操作。 当用户将一个菜单项拖动到购物车div上时,drop函数将被调用。该函数通过数据传输对象获取拖动的元素,并将其添加到购物车div中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值