拖放是一种常见的特性, 属于html5标准的一部分, 即抓取工具往后拖动到另一个位置, 在html5中, 任何元素都可被设置拖放。
首先, 我们要给须要拖动的HTML元素启用拖动功能, 设置属性draggable="true",

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

提示:a标签和img标签默认是启用该属性的, 可不须要设置draggable属性。

draggable有三个值, 如下所示:

html5可拖动图标导航菜单JavaScript HTML5拖拽/拖放 Ruby

draggable = true(元素可以被拖动)

draggable = false(元素不能被拖动)

draggable = auto(浏览器可以自主决定某个元素是否可以被拖动)

【用法】

当我们用鼠标拖拽目标元素过程中会触发的事宜:

ondragstart:用户按下鼠标开始拖动时触发

ondrag:用户正在拖动时反复触发

ondragend:用户结束拖动后触发

<img id="imgs" ondragstart="startFun()" ondrag="ondragFun()" ondragend="ondragendFun()" src="../img/a.png"/>

当拖动元素进入目标容器内触发的事宜:

ondragenter:鼠标拖动工具进入开释区时触发

ondragover:被拖动物体进入目标容器内移动时反复触发

ondragleave:拖动工具在开释区没有开释就离开容器时触发

ondrop:被拖动物体在目标容器内开释时触发

<div id="container" ondragenter="ondragenterFun(event)" ondragover="ondragoverFun(event)" ondragleave="ondragleaveFun()" ondrop="drop()"></div>

ondragenter和ondragover事宜的默认行为是谢绝接管任何被拖放的项目, 以是我们必须要做的最主要的事情便是防止这种默认行为的发生。

因此, 我们只须要在这两个事宜调用的函数中传入event工具, 利用event.preventDefault()就可取消这种默认行为;举个例子, 在drop事宜时, Firefox浏览器会关闭网页, 转而显示被拖动图片img元素src所引用的地址。

取消元素默认行为:

function ondragenterFun(e){ e.preventDefault();}function ondragoverFun(e){ e.preventDefault();}

在event工具中, 我们会利用dataTransfer属性来获取DataTransfer工具, 在DataTransfer工具中有我们操作数据的属性和方法, 详细如下:

datatransfer:转移开释元素的数据到开释区, 返回Datatransfer工具

event.dataTransfer //返回DataTransfer工具

DataTransfer工具的属性:

files:处理从操作系统拖动并开释到开释区的文件;

types:返回一个字符串数组, 该工具包含了dataTransfer工具中数据的所有类型;

items:返回DataTransferItems工具, 该工具代表了拖动数据;

dropEffect:设置拖放目标许可发生的拖放行为, 如果此处设置的拖放行为不在effectAllowed属性设置的可拖放行为内, 拖放操作将会失落败。
该属性值只许可为"null"、"copy"、"link"或"move";

effectAllowed:设置拖动元素许可发生的拖动行为, 该属性值可为"none"、"copy"、"copyLink"、"copyMove"、"link"、"linkMove"、"move"、"all"或"uninitialized";

DataTransfer工具的方法:

setData( format , data ):将指定格式的数据赋值给dataTransfer工具,参数format定义数据的格式也便是数据的类型,data为待赋值的数据。

getData( format ):从dataTransfer工具中获取指定格式的数据,format代表数据格式,data为数据。

clearData( [format] ):从dataTransfer工具中删除指定格式的数据,参数可选,若不给参数,将删除工具中所有的数据。

setDragImage(el, x, y):设置拖放操作的图标,个中el代表自定义图标,x代表图标与鼠标在水平方向上的间隔,y代表图标与鼠标在垂直方向上的间隔。

理解了H5拖动利用的api往后我们接下来看一个综合的案例, 功能如下:

1)、实现图片拖动功能;

2)、实现图片复制功能;

3)、过滤不能拖动的元素;

4)、实现拖动本地图片到浏览器指定位置;

公共css部分:

<style>#dropIn{border:1px solid #AAAAAA;height:100px;margin-bottom: 10px;padding: 10px;}#dropIn>img{margin-right: 10px;border:2px solid deepskyblue;}img{width:100px;border-radius: 10px;border:2px solid red;}</style>

html部分:

<body><div id="dropIn"></div> <!--开释区--><img id="drop1" src="img/a.png" alt="" /><!--拖动的图片元素--></body>

js部分:

<script type="text/javascript">var darggID;function getId(el){ return document.getElementById(el)}var dropId1 = getId("drop1");var dropInId = getId("dropIn");//取消事宜默认行为dropInId.ondragenter = cancelDefault;dropInId.ondragover = cancelDefault; //绑定拖动元素开释时触发的事宜dropInId.ondrop = drop; //绑定dropId1.ondragstart = startFun;function cancelDefault(ev){ //取消默认行为 ev.preventDefault();}function startFun(ev){ darggID = ev.target.id; //获取被拖动元素的id //从源工具上的事宜处理中保存数据,数据类型为"Text" ev.dataTransfer.setData("Text",darggID);}function drop(ev){ ev.preventDefault(); // 从目标工具上的事宜处理中读取"Text"类型数据 var data=ev.dataTransfer.getData("Text"); // 插入到目标工具中 ev.target.appendChild(document.getElementById(data));}</script>

接下来我们添加两张图, "drop2"是实现复制的图片, "drop3"是既不能复制也不能拖动的图片;

<img id="drop2" src="img/b.png" alt="" /><img id="drop3" src="img/c.png" alt="" />

添加js代码

//获取页面元素var dropId2 = getId("drop2");var dropId3 = getId("drop3");//绑定事宜dropId2.ondragstart = startFun;dropId3.ondragstart = startFun;//修正drop函数为function drop(ev){ ev.preventDefault(); // 从目标工具上的事宜处理中读取"Text"类型数据 var data=ev.dataTransfer.getData("Text"); if(data=='drop1'){ //移动 ev.target.appendChild(document.getElementById(data)); } if(data=='drop2'){//复制 var nreEl=document.getElementById(darggID).cloneNode(false); getId("dropIn").appendChild(nreEl); } if(data=='drop3'){//过滤drop3,drop3不做任何操作 alert('过滤drop3') }}

接下来我们实现拖动本地图片到浏览器, 我们就将图片拖动到id为"dropIn"的这个div中;添加js:

/document 监听drop 并阻挡浏览器打开客户真个图片/document.ondragover = function (e) { //只有在ondragover中阻挡默认行为 e.preventDefault();};document.ondrop = function (e) { //阻挡 document.ondrop的默认行为 e.preventDefault();};//dropIn是div的iddropIn.ondrop = function (e) { var list = e.dataTransfer.files; for (var i = 0; i < list.length; i++) { var f = list[i]; reader(f); }};function reader(f) { var reader = new FileReader(); //读取数据 reader.readAsDataURL(f); reader.onload = function () { var img = new Image(); img.src = reader.result; dropIn.appendChild(img); }}

【浏览器支持】

目前只有Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari5支持拖放,在 Safari5.1.2 中不支持拖放。

末了再和大家分享一个技巧, 这种拖动行为还能跨浏览器事情, 这里说的跨浏览器不是浏览器之间的跨窗口, 而是可以从Chrome浏览器拖动到Firefox浏览器, 由于拖放功能的支持是集成在操作系统里面的, 有着相同的特性。