HTML5 拖放(Drag 和 Drop)功能开发——基础实战

来源:互联网 发布:linux 打开80端口 编辑:程序博客网 时间:2024/06/03 06:43

随着HTML5的普及度越来越高,现在写代码也遇到一些了,经过同事的点播开展了一次Dojo活动用以技术交流,我也乘此机会将HTML5的拖放功能整理了一下。

 

简介


拖拽(Drag/Drop)是个非常普遍的功能。在生活中,拖放物品其实是相当常见的一个动作。标榜“互联网生活尖凿狮”的程序猿也在一直试图用鼠标模拟出“手”的操作,用来给用户以更好的体验,你可以抓住一个对象,并且拖动到你想放置的区域。很多javascript都类似实现了相关的功能,例如,jQueryUI的draganddrop组件,比如《JS实现页面拖放》。。在HTML5中,拖拽(draganddrop)成为了标准操作,任何元素都支持。


 

定义

拖放是一种常见的特性,即抓取对象以后拖到另一个位置。

在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。


 

浏览器支持

虽然是HTML5的东西,但是,根据findmebyip中显示的浏览器支持情况来看,IE6~IE8都是有drag & drop API的(见下截图)。

Internet Explorer 6~9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。

注释:在 Safari 5.1.2 中不支持拖放。

根据自己的简单的测试,低版本的IE浏览器确实支持诸如ondragstart事件,但是会报不认识dataTransfer的错误。可见IE在细节的处理上与现代浏览器有些不同。


 

HTML5 拖放实例

下面的例子是一个简单的拖放实例:

 

复制代码
<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><div id="div1" ondrop="drop(event)"ondragover="allowDrop(event)"></div><img id="drag1" src="http://www.baidu.com/img/baidu_jgylogo3.gif" draggable="true"ondragstart="drag(event)" width="336" height="69" /></body>
复制代码

 

它看上去也许有些复杂,不过我们可以分别研究拖放事件的不同部分。


 

设置元素为可拖放

首先,为了使元素可拖动,把 draggable 属性设置为 true :

<img draggable="true" />

 

拖动什么 - ondragstart 和 setData()

然后,规定当元素被拖动时,会发生什么。

在上面的例子中,ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。

dataTransfer.setData() 方法设置被拖数据的数据类型和值:

function drag(ev){ev.dataTransfer.setData("Text",ev.target.id);}

在这个例子中,数据类型是 "Text",值是可拖动元素的 id ("drag1")。


 

放到何处 - ondragover

ondragover 事件规定在何处放置被拖动的数据。

默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。

这要通过调用 ondragover 事件的 event.preventDefault() 方法:

event.preventDefault()

 

进行放置 - ondrop

当放置被拖数据时,会发生 drop 事件。

在上面的例子中,ondrop 属性调用了一个函数,drop(event):

复制代码
function drop(ev){ev.preventDefault();var data=ev.dataTransfer.getData("Text");ev.target.appendChild(document.getElementById(data));}
复制代码

代码解释:

  • 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
  • 通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
  • 被拖数据是被拖元素的 id ("drag1")
  • 把被拖元素追加到放置元素(目标元素)中

 

 

拖放(Drag 和 Drop)各属性生命周期

刚才大家已经看到了一些新鲜属性名词,如 ondragstart。或许还是很陌生,不知其所以,下面看一张表格或许能豁然开朗:

 

拖动生命周期属性值描述拖动开始ondragstartscript在拖动操作开始时执行脚本(对象是被拖拽元素)拖动过程中ondragscript只要脚本在被拖动就允许脚本(对象是被拖拽元素)拖动过程中ondragenterscript当元素被拖动到一个合法的放置目标时,执行脚本(对象是目标元素)拖动过程中ondragoverscript只要元素正在合法的放置目标上拖动时,就执行脚本(对象是目标元素)拖动过程中ondragleavescript当元素离开合法的放置目标时(对象是目标元素)拖动结束ondropscript将被拖拽元素放在目标元素内时运行脚本(对象是目标元素)拖动结束ondragendscript在拖动操作结束时运行脚本(对象是被拖拽元素)

 


 

写在哪呢?

其实参照上表“描述”中括号内的提示即可知道,不过为了能更直观的了解到,特呈上代码:

被拖放元素

<span draggable="true" id="Span1" ondragstart="fooDragStart(this, event)" ondrag="fooDrag(this, event)" ondragend="fooDragEnd(this, event)"><img src="../images/yjj_1.png"></span>

 

目标元素

<div  id="div1" ondrop="fooDrop(this, event)"                            ondragenter="fooDragEnter(this, event)" ondragleave="fooDragLeave(this, event)"                            ondragover="fooDragOver(this,event)">                        </div>

执行顺序

下面,我将展示将一张图片放入div中的整个script执行过程:

执行元素介绍

执行结果

  1. 成功将图片拖入div中

 

  

复制代码
onDragStart,当元素被拖动到一个合法的放置目标时,执行脚本(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDrag,只要脚本在被拖动就允许脚本onDragEnter,在拖动操作开始时执行脚本onDragOver,只要元素正在合法的放置目标上拖动时,就执行脚本(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDragOver,只要元素正在合法的放置目标上拖动时,就执行脚本(对象是目标元素)onDrop,在拖动操作结束时运行脚本onDragEnd,在拖动操作结束时运行脚本
复制代码

 

  2. 已拖放,可最终未放入div中

复制代码
onDragStart,当元素被拖动到一个合法的放置目标时,执行脚本(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDrag,只要脚本在被拖动就允许脚本onDragEnter,在拖动操作开始时执行脚本onDragOver,只要元素正在合法的放置目标上拖动时,就执行脚本(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDragOver,只要元素正在合法的放置目标上拖动时,就执行脚本(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDragLeave,当元素离开合法的放置目标时(对象是目标元素)onDrag,只要脚本在被拖动就允许脚本onDrag,只要脚本在被拖动就允许脚本onDragEnd,在拖动操作结束时运行脚本
复制代码

 

由上两个执行顺序的Log能看出:

  1. 只有将“被拖拽元素”放入“目标元素”才会执行“onDrop”属性的方法;
  2. “onDrag”的事件只要鼠标按住并且拖动就会持续不断的执行;
  3. “onDragOver”的事件是只要鼠标按住、拖动“被拖拽元素”在“目标元素”上滑过就会持续不断的执行;
  4. “onDragEnd”的事件无论如何,只要按住的鼠标放开了,就会执行

 

小结

能读到这里说明你是比较勤劳的了,看我唠唠叨叨。

在第一步我也只是介绍了HTML5 拖放(Drag 和 Drop)的基本功能,一些深入的比如“文件的拖放”、“从浏览器拖放到桌面”以及“从桌面拖放到浏览器”会在今后的文章中一一讲解。

感谢阅读。文中要是有表述不准确的地方,欢迎指正。


转http://www.cnblogs.com/ijjyo/p/4300717.html

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子突然过于的兴奋不睡觉是怎么办 刚出生的宝宝听力未通过怎么办 孩子多动症被老师打不上学怎么办 小孩在校被学生打家长该怎么办? 8岁儿童好动上课不注意听课怎么办 怀孕第一个月喝了啤酒怎么办 不知道自己怀孕喝了酒怎么办 怀孕一个月不知道喝酒了怎么办 老师说孩子上课不专心听讲怎么办 二年级孩子上课不认真听讲怎么办 二年级的孩子浮躁上课不认真怎么办 三年级的小孩上课不认真听讲怎么办 大班孩子上课不专心听讲玩怎么办 老师跟家长说小孩上课讲话怎么办 别的家长动手打自己的孩子怎么办? 一岁3个月宝宝骨龄偏小怎么办 宝宝9个月了越来越粘人怎么办? 孩子突然说话结巴口吃了怎么办啊 很久不说话了不敢说话了怎么办 宝宝2岁了还不会说话怎么办 2岁的宝宝还不会说话怎么办 小宝宝有四个月了母乳不够吃怎么办 一个月的宝宝吐奶厉害怎么办 新生儿吐奶吐一次吐的特别多怎么办 把孩子打了一次现在说话结巴怎么办 宝宝五岁了口吃越来越严重了怎么办 幼儿把自己的舌头扣破皮了怎么办 6岁宝贝烧到39度怎么办 2岁半的宝宝说话结巴怎么办 2周3宝宝不会说话胆小怎么办 宝宝我2岁多了说话有点结巴怎么办 两岁宝宝说话突然结巴了怎么办 两岁3宝宝叫她名字不理人怎么办 九个月的宝宝身高不达标怎么办 3岁宝宝又吐又拉怎么办 宝宝发烧39度怎么办手脚很烫 两岁宝宝吃什么吐什么怎么办 7岁宝宝吃多了吐怎么办 7个月的宝宝大便干燥怎么办 10个月宝宝便秘大便干燥怎么办 一岁半宝宝老是拉糊糊状大便怎么办