HTML5的拖放 API使用详解

在HTML5之前,如果要实现拖放效果,一般会使用mousedown、mousemove和mouseup三个事件进行组合来模拟出拖拽效果,比较麻烦。而HTML5规范实现了原生拖放功能,使得元素拖放的实现更加方便和高效。

默认情况下,图像、链接和文本是可以拖动的。文本只有在被选中的情况下才能拖动,而图像和链接在任何时候都可以拖动。

HTML5为所有的HTML元素规定了一个draggable属性,表示元素是否允许拖动。要想让其他元素也能被拖动,可以设置这个属性为true。

一. 实现拖放的步骤:

1.1 步骤1:创建一个可拖拽对象:

1.1.1如果想要拖动某个元素,需要设置元素的 draggable 属性为 true。

<img id="dragImg" draggable="true" />
1.1.2给 dragstart 设置一个事件监听器存储拖拽数据。

document.getElementById("dragImg").addEventListener("dragstart", function(event) {
    // 存储拖拽数据和拖拽效果...
    event.dataTransfer.setData("Text",ev.target.id);
}, false);
1.2 步骤2:放置对象:

假设放置对象的DOM为:

<div id="dragTarget"></div>
1.2.1 dragenter事件,用来确定放置目标是否接受放置。

如果放置被接受,那么这个事件必须取消。

document.getElementById("dragTarget").addEventListener("dragenter", function(event) {
    // 阻止浏览器默认事件
    event.preventDefault();
}, false);
1.2.2 dragover事件,用来确定给用户显示怎样的反馈信息。

如果这个事件被取消,反馈信息(通常就是光标)就会基于 dropEffect 属性的值更新。

document.getElementById("dragTarget").addEventListener("dragover", function(event) {
    // 阻止浏览器默认事件
    event.preventDefault();
}, false);
1.2.3 最后是drop事件,允许放置对象。

document.getElementById("dragTarget").addEventListener("drop", function(event) {
    event.preventDefault();
    var data=event.dataTransfer.getData("Text");
    event.target.appendChild(document.getElementById(data));
}, false);
1.3例子:

(备注: 转载自: http://www.w3school.com.cn/tiy/t.asp?f=html5_draganddrop )

<!DOCTYPE HTML>
<html>
<head>
    <style type="text/css">
        #div1 {width:488px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    </style>
    <script type="text/javascript">
        function allowDrop(ev){
            ev.preventDefault();
        }
        function drag(ev){
            ev.dataTransfer.setData("Text",ev.target.id);
        }
        function drop(ev){
            ev.preventDefault();
            var data=ev.dataTransfer.getData("Text");
            ev.target.appendChild(document.getElementById(data));
        }
    </script>
</head>
<body>
    <p>请把 W3School 的图片拖放到矩形中:</p>
    <div id="dragTarget" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <br />
    <img id="dragImg" src="/i/w3school_banner.gif" draggable="true" ondragstart="drag(event)" />
</body>
</html>

二. 拖放的相关事件:

事件 产生事件的元素 描述
dragstart 被拖放的元素 开始拖放操作
drag 被拖放的元素 拖放过程中
dragenter 拖放过程中鼠标经过的元素 被拖放元素开始进入本元素的范围内
dragover 拖放过程中鼠标经过的元素 被拖放元素正在本元素范围内移动
dragleave 拖放过程中鼠标经过的元素 被拖放元素离开本元素的范围
drop 拖放的目标元素 有其他元素被拖放到本元素中
dragend 拖放的对象元素 拖放操作结束
三. DataTransfer对象的属性与方法

3.1 DataTransfer对象的属性:

属性 描述
dropEffect 表示拖放操作的视觉效果,允许对其进行值的设定。该效果必须在用effectAllowed属性指定的允许的视觉效果范围内,允许指定的值有:none、copy、link、move。
effectAllowed 用来指定当元素被拖放时所允许的视觉效果。可以指定的值有:none、copy、copyLink、copyMove、link、linkMove、all、uninitialize。
files 返回表示被拖拽文件的 FileList。
types 存入数据的MIME类型。如果任意文件被拖拽,那么其中一个类型将会是字符串”Files”。
方法 描述
void setData(DOMString format, DOMString data) 向DataTransfer对象存入数据。
DOMString getData(DOMString data) 读取DataTransfer对象中的数据。
void clearData(DOMString format) 清除DataTransfer对象中的数据。如果省略参数format,则清除全部数据。
void setDragImage(Element image, long x, long y) 用img元素来设置拖放图标。

时间: 2024-09-30 02:22:48

HTML5的拖放 API使用详解的相关文章

格式-html5开发meta标签求详解

问题描述 html5开发meta标签求详解 html5里meta标签到底该怎么理解?开发pc网站与开发移动网站,我发现meta里的内容大不一样,但是我学到的教程里貌似没有移动平台里那么多的陌生东西啊,比如< meta name="viewport" content="width=device-width,height=device-height, user-scalable=no,initial-scale=1, minimum-scale=1, maximum-sca

jQuery.datatables.js插件用法及api实例详解_jquery

1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ); 示例:http://www.guoxk.com/html/DataTables/Zero-configuration.html 2.DataTables的一些基础属性配置 "bPaginate": true, //翻页功能 "bLengthChange": true, //改变每页显示数据数量 "

Storm专题二:Storm Trident API 使用详解

一.概述      Storm Trident中的核心数据模型就是"Stream",也就是说,Storm Trident处理的是Stream,但是实际上Stream是被成批处理的,Stream被切分成一个个的Batch分布到集群中,所有应用在Stream上的函数最终会应用到每个节点的Batch中,实现并行计算,具体如下图所示:       在Trident中有五种操作类型: Apply Locally:本地操作,所有操作应用在本地节点数据上,不会产生网络传输      Repartit

Java规则引擎与其API应用详解

详解 本文对Java规则引擎与其API(JSR-94)及相关实现做了较详细的介绍,对其体系结构和API应用有较详尽的描述,并指出Java规则引擎,规则语言,JSR-94的相互关系,以及JSR-94的不足之处和展望 本文对Java规则引擎与其API(JSR-94)及相关实现做了较详细的介绍,对其体系结构和API应用有较详尽的描述,并指出Java规则引擎,规则语言,JSR-94的相互关系,以及JSR-94的不足之处和展望 复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business l

HTML5 LocalStorage 本地存储原理详解

  说到Web开发中的本地存储,大家最先想到的应该就是Cookies这玩意了,最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还蛮好.很早以前那些禁用cookies的用户也都慢慢的不存在了,就好像以前禁用ja vasc ript的用户不存在了一样. userData是IE的东西,垃圾.现在用的最多的是Flash吧,空间是Cookie的25倍,基本够用.再之后Google推出了Gear

转 JavaMail发送和接收邮件API(详解)

一.JavaMail概述:     JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分.     厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP:简单邮件传输协议,用于发送电子邮件的传输协议: POP3:用于接收电子邮件的标准协议: IMAP:互联网消息协议,是POP3的替代协议.     这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP

html5入门之设计原理详解

HTML5和CSS3的时代到来了,新版2011版淘宝网首页已全部使用HTML5,拥抱变化才是王道.为之漫笔翻译的很好,看了一遍后,感觉理解了很多,强烈推荐其他做开发的童鞋尤其前端也来看看. 不仅让我摸清了html4,xhtml1.0, xhtml2.0, html5之间的关系,也理解了为什么会出现HTML5,同时,加紧推进在项目中应用HTML5. ---------------------------------------------------------------------------

探讨PHP使用eAccelerator的API开发详解_php技巧

1.API和文档说明:eAccelerator提供了便捷便捷而又稳定的本机缓存实现方式,由于大部分代码实现基于共享内存,所以只能在*nix平台中使用,Windows平台Michael就暂时不知道何时有这方面的支持了.eAccelerator提供如下的API接口和文件:(下述文件均在源码包的doc/php/目录下)文件列表: 复制代码 代码如下:     cache.php    dasm.php    encoder.php    info.php    loader.php    sessio

【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用作nginx.conf文件中Lua API的网关. 下面描述的Nginx Lua API只能在这些配置指令的上下文中运行的用户Lua代码中调用.API以两个标准软件包ngx和ndk的形式暴露给Lua. 这些软件包位于ngx_lua中的默认全局范围内,并且始终可在ngx_lua指令中使用. 这些包可以