HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面。

拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有松开鼠标),此时开始拖动;在拖动的过程中,只要没有松开鼠标,将会不断产生事件-----这个过程称为“拖”。把被拖动的元素拖动到另外一个元素上并松开鼠标-----这个过程被称为“放”。

一、启动拖放

在HTML5中,<img .../>元素默认就是可拖动的;而<a .../>元素只要设置了href属性,它默认也是 可拖动的。

对于普通的元素,如果想要让它变成可拖动的只要将该元素的draggable属性设置为true即可。但仅仅设置该元素的draggable属性还不够,因为仅仅设置了draggable='true'只是表示该元素可拖动,但拖动时并未携带数据,因此用户看不到拖动的效果。

为了 让拖动操作能携带数据,应该为被拖动的元素指定ondragstart事件指定监听器,在该监听器中让拖动操作可以携带数据。

    <div style="width:150px;height:150px;background:rgba(195, 86, 246, 0.31);border:1px solid gray;"
id="div1"
draggable="true">
可拖动div
</div>
<script type="text/javascript">
//绑定拖动事件
var div1 = document.getElementById('div1');
div1.ondragstart = function (e) {
//让拖动操作携带数据
e.dataTransfer.setData('text/plain','www.baidu.com');
}
</script>

二、接受“放”

拖动时显示禁止图标,这表拖动到的“目的地”并不接受拖动的元素-----这是因为当拖动元素经过document时,document对象默认阻止了拖动事件,而其他HTML组件也位于document对象内,因此它们也不能接受“放”。

为了让document可以接受“放”,应该为documen的ondragover事件指定监听器,在监听器中取消document对拖动事件的默认行为。

document.ondragover=function(){

  //取消事件的默认行为

  return false;

}

当用户把div元素拖到指定位置释放后,Firefox浏览器默认会打开一个新页面,页面的URL正是拖放操作携带的数据。如果使用Chrome浏览器来浏览该页面,当用户把div元素拖放到指定位置释放后,Chrome浏览器并没有执行任何默认动作。

由此可见,不同浏览器对于拖放操作的默认动作并不相同,如果开发者取消拖放操作的默认动作,则可以为document的ondrop事件绑定监听器。

document.ondrop=function(e){

e.stopPropagation();
e.preventDefault();

  //取消默认行为

  return false;

}

实例:

    <a href="http://www.baidu.com" id="link1">百度首页</a>
<script type="text/javascript">
var link1 = document.getElementById('link1');
//链接事件
link1.onclick = function () { //实验证明,超练级的取消浏览器默认动作 return false;可行
//取消默认操作
return false;
}
//拖拽处理
document.ondragover = function (e) {
e.stopPropagation();
e.preventDefault();
}
document.ondrop = function (e) {
e.stopPropagation();
e.preventDefault(); //实验证明,在拖拽API中,火狐浏览器的取消默认操作 return false;没有起作用
//return false;
}
</script>

在用户拖放HTML元素的过程中,可能触发如下事件

 事件  事件源  描述
 ondragstart  被拖动的HTML元素  开始拖动操作时触发该事件
 ondrag  被拖动的HTML元素  拖动过程中不断触发该事件
ondragend   被拖动的HTML元素  拖动结束时触发该事件 
ondragenter   拖动时鼠标经过的元素  被拖动的元素进入本元素的范围内时触发该事件 
ondragover   拖动时鼠标经过的元素  被拖动的元素进入本元素的范围内拖动时会不断触发该事件 
ondragleave   拖动时鼠标经过的元素  被拖动的元素离开本元素时触发该事件 
ondrop   拖动时鼠标经过的元素  其他元素被放到了本元素中时触发该事件 

实例:

    <div style="width:150px;height:150px;background:rgba(195, 86, 246, 0.31);border:1px solid gray;"
id="div1"
draggable="true">
可拖动div
</div>
<script typee="text/javascript">
var div1 = document.getElementById('div1');
div1.ondragstart = function (e) {
//添加携带数据
e.dataTransfer.setData('text/plain', "www.baidu.com");
}
document.ondragover = function () {
//取消默认操作
return false;
}
document.ondrop = function (e) {
//固定到指定位置,并显示携带数据
div1.style.position = 'absolute';
div1.style.left = e.pageX + 'px';
div1.style.top = e.pageY + 'px';
div1.innerHTML = e.dataTransfer.getData('text/plain'); //取消默认操作
e.stopPropagation();
e.preventDefault();
}
</script>

三、DataTransfer对象

拖放触发的拖放事件有一个dataTransfer属性,该属性是一个DataTransfer对象,该对象包含如下属性和方法

  • dataTransfer.dropEffect:设置或返回拖放目标上允许拖放的行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性只允许为"none"、“copy”、“link”和“move”四个值之一。
  • dataTransfer.effectAllowed:设置会返回被拖动元素允许发生的拖动行为。该属性值可设置为“none”、“copy”、“copyLInk”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。
  • dataTransfer.items:该属性返回DataTransferItems对象,该对象代表了拖动数据。
  • dataTransfer.setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向的距离;y设置图标与鼠标在垂直方向的距离
  • dataTransfer.addElement(element):添加自定义图标。
  • dataTransfer.types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。
  • dataTransfer.getData(format):获取DataTransfer对象中format格式的数据。
  • dataTransfer.setData(format,data):向DataTransfer对象中设置format格式的数据。其中format代表数据格式,data代表数据。
  • dataTransfer.clearData([format]):清除DataTransfer对象中format格式的数据。如果省略format格式,则意味着清除DataTransfer对象中的全部数据。
  • dataTransfer.files:获取外部拖拽文件的一个类似数组的集合(length)。集合中每个元素有type属性,依次判断拖拽的文件类型。实现这个属性的浏览器有IE10+、Firefox 3.5+和Chrome。

通过DataTransfer对象,可以让拖放操作实现更丰富的功能-----开发者可以在拖放开始时(ondragstart)事件将拖放源的数据存入DataTransfer对象中,然后在拖放结束从DataTransfer对象中读取数据,这样就可以完成更复杂的错放操作了。

实例:

四、拖放行为

五、改变拖放图标

HTML5新增的拖放API---(一)的更多相关文章

  1. 过段时间逐步使用HTML5新增的web worker等内容

    想来快2017年了,2013年前的手机应该很少有人用了,以后逐渐使用HTML5新增的高级API吧. 先把web worker的内容再熟悉一下,因为微软虚拟学院的'面向有经验开发人员的 JavaScri ...

  2. HTML5权威指南--标签新变化,文件API,拖放API(简要学习笔记一)

    1.标签元素更加语义化   2.内容类型仍然为“text/html”    扩展符仍然为html或者htm.    <1>DOCTYPE 声明<!DOCTYPE html>就可 ...

  3. html5的新特性——拖放API

    在HTML5之前只能使用鼠标事件模拟出"拖放"效果:HTML5专门为拖放提供了7个事件句柄.  被拖动的源对象可以触发的事件: (1)ondragstart:源对象开始被拖动 (2 ...

  4. HTML5新增Canvas标签及对应属性、API详解(基础一)

    知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一.标签 ...

  5. HTML5新增video标签及对应属性、API详解

    知识说明: 比不上很牛的前端开发人员,但自始至终明白“万丈高楼平地起”,基础最重要,初学HTML5,稳固基础第一步,把最基本的整理下来,留下自己学习的痕迹.HTML5新增的video标签,将其属性以及 ...

  6. HTML5 进阶系列:拖放 API 实现拖放排序

    前言 HTML5 中提供了直接拖放的 API,极大的方便我们实现拖放效果,不需要去写一大堆的 js,只需要通过监听元素的拖放事件就能实现各种拖放功能. 想要拖放某个元素,必须设置该元素的 dragga ...

  7. HTML5 进阶系列:拖放 API 实现拖放排序(转载)

    HTML5之拖放API实现拖放排序 前言 HTML5 中提供了直接拖放的 API,极大的方便我们实现拖放效果,不需要去写一大堆的 js,只需要通过监听元素的拖放事件就能实现各种拖放功能. 想要拖放某个 ...

  8. 深入理解javascript选择器API系列第三篇——HTML5新增的3种selector方法

    前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuery的称赞,很多是由于jQuery方便的元素选择器 ...

  9. HTML5 十大新特性(七)——拖放API

    拖放API是H5专门为了鼠标拖放而新提供了7个事件,可以分成三个部分来讲. 一.拖动的源对象(source)可以触发的事件 dragstart:拖动开始 drag:拖动进行中 dragend:拖动结束 ...

随机推荐

  1. POJ 1002 - 487-3279 STL

    先把不是标准格式的字符串变成标准格式再输出出现两次以上的标准串和出现的次数不然输出 "No duplicates." #include <iostream> #incl ...

  2. poj2456 二分逼近寻找正确答案

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10078   Accepted: 4988 ...

  3. CODEVS 3137 栈练习1

    3137 栈练习1 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 给定一个栈(初始为空,元素类型为整数,且小于等于100),只 ...

  4. jvm的client和server

    最近研究c++代码调用java的jar,发现64位的下的jvm在server路径,而32位的jvm则存在client路径下面,于是十分好奇,查了下,这里做个记录 JVM Server模式与client ...

  5. CSS3 基础知识

    CSS3 基础知识1.边框    1.1 圆角  border-radius:5px 0 0 5px;    1.2 阴影  box-shadow:2px 3px 4px 5px rgba(0,0,0 ...

  6. PC机安装android apk | adb install -r

    PC 下载 *****.apk 通过adb直接安装到android系统

  7. sql server高效分页控件及c#调用实例

    第一.首先在sqlserver中创建一个存储过程 USE [BZY] GO /****** 对象: StoredProcedure [dbo].[up_ProcCustomPage2005_New] ...

  8. Ghost源代码

    http://download.csdn.net/download/xiaoshuai0101/4739231 彻底的掩藏磁盘,让病毒和破坏的人没有一点办法上传者 guizhoutiger

  9. 转:SVN 出现This client is too old to work with working copy...错误

    本地进行SVN客户端版本更新,但是之前一些代码是用的旧svn客户端提交的,这时候进行代码更新或者提交代码可能会出现错误,我这边是NetBeans中提交代码就出现了以下错误:This client is ...

  10. python 程序穩定性閒談-續集

    前文再續,書接上一回.上次總結python錯誤碼返回與異常機制共用的一些原則,毫無疑問地,仍會出現程序不穩定的現象(好吧,可能是我個人能力問題).在公司做的一個項目中,出現了因爲使用外部模塊造成pyt ...