html5的拖拽事件
原生拖放
一、若要一个元素可以被拖放,首先要为元素添加draggable属性
| true | 可以被拖放 |
| false | 不可以被拖放 |
| auto | 除img或url以外都可以被拖放 |
| 其他值 | 都不可以被拖放 |
注释:在火狐中设置draggable属性无用,但可以再dragstart事件中为dataTransfer对象中添加setData()方法后就可以允许被拖拽。支持draggable的属性的浏览器有IE10+、Firefox 4+、Safari 5+,chrome,Opera 11.5+.
二、拖拽发生过程
被拖拽元素
| dragstart | 按下鼠标键并开始移动鼠标时 |
| drag |
在dragstart事件之后,在元素被拖动期间会持续触发该事件 |
| dragend | 当拖动停止时,会触发dragend事件 |
放置目标元素
| dragenter | 有元素被拖动到放置目标上 |
| dragover |
紧随dragenter发生,在被拖动的元素 还在放置目标范围内移动时,会持续触发该事件 |
| dragleave | 在元素被拖出放置目标时触发 |
| drop | 元素被放到了放置目标中触发 |
注释:拖拽发生过程:dragstart->drag->dragenter->dragover->dragleave/drop->dragend
三、自定义放置目标
原因:所有元素默认是不允许放置的,尽管都支持放置目标事件,当拖放元素经过不允许放置的元素时,就会看到一种特殊光标(圆环中有一条反斜线)。
解决方法:把任何元素都变成有效的放置目标,重写dragenter和dragover事件的默认行为.如
function prevent(e){
var e = e || window.event;
e.preventDefault(e);
}
droptarget.dragover = prevent;
droptarget.dragenter = prevent;
此时特殊光标会变成允许放置的光标。
注释:firfox 3.5+中,放置事件的默认行为是打开被放到放置目标上的url,为支持FireFox支持正常的拖放,还要取消drop事件的默认行为,阻止它打开URL.
四、dataTransfer对象
IE5引入了dataTransfer对象,它是事件对象的一个属性,用于从被拖动元素向放置目标传递字符串格式的数据。
| setData() | 保存值,第一个参数可以是“text/plain"和"text/uri-list" |
| getData() | 获取在setData()中保存的值。 |
| dropEffect | 属性,知道被拖动的元素能够执行哪种放置行为。搭配effectAllowed属性才有用 |
| effectAllowed | 属性,表示允许拖动元素的哪种dropEffect. |
注意:dataTransfer对象中的数据只能在drop事件处理程序中读取。如果ondrop处理程序中没有读到数据,那就是dataTransfer对象已经被销毁,数据也丢失了。
| dropEffect的值 | 含义 |
| none | 不能把拖动的元素放在这里 |
| move | 应该把拖动的元素移动到放置目标 |
| copy | 应该把拖动的元素复制到放置目标 |
| link | 表示放置目标会打开拖动的元素(但拖动的元素必须是一个连接,有URL) |
| effectAllowed值 | 含义 |
| uninitialized | 没有给被拖动的元素设置任何放置行为 |
| none |
被拖动的元素不能有任何行为 |
| copy | 只允许值为'copy'的dropEffect |
| link | 只允许值为'link'的dropEffect |
| move | 只允许值为'move'的dropEffect |
| copyLink | 只允许值为'copy'和“link”的dropEffect |
| copyMove | 只允许值为'copy'和“move”的dropEffect |
| linkMove | 只允许值为'move'和“link”的dropEffect |
| all | 允许任意的dropEffect |
html5的拖拽事件的更多相关文章
- HTML5原生拖拽事件的值传递(三dataTransfer对象)
引用一篇博客,讲解的比较详细:http://www.tuicool.com/articles/j6Zbam
- html5拖拽事件 xhr2 实现文件上传 含进度条
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- HTML5 02. 多媒体控件、拖拽事件、历史记录、web存储、应用程序缓存、地理定位、网络状态
多媒体 video:是行内块(text-align: center; 对行内块适用) <figure></figure>: 多媒体标签 : <figcaption> ...
- HTML5深入学习之鼠标跟随,拖拽事件
知识点(鼠标跟随): mousedown: 当用户用鼠标点击在某一元素上就会触发该事件 mouseover: 当鼠标指针在某一元素上移动就会触发改事件 下面这个例子的效果就是鼠标点击元素后,元素跟着 ...
- HTML5之拖拽(兼容IE和非IE)
前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实 ...
- HTML5文件拖拽
HTML5新增的File API, 可以获取名称.文件大小.类型等信息,需先对DOM中的Element进行拖拽事件绑定 相关API 首先获取节点,绑定拖动到该节点的事件,可以改变鼠标形状 var dr ...
- html5 文件拖拽上传
本文首先发表在 码蜂笔记 : http://coderbee.net/index.php/web/20130703/266 html5 文件拖拽上传是个老话题了,网上有很多例子,我一开始的代码也是网 ...
- Nodejs express、html5实现拖拽上传
一.前言 文件上传是一个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传.给用户体验带来很大问题.html5开始支持拖拽上传的需要的api.nodejs ...
- H5原生拖拽事件
使用原生js实现简单的拖拽事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
随机推荐
- fuzz系列之afl
afl 实战 前言 像 libFuzzer, afl 这类 fuzz 对于 从文件 或者 标准输入 获取输入的程序都能进行很好的 fuzz, 但是对于基于网络的程序来说就不是那么方便了. 这篇文章介绍 ...
- [转]How do you build a database?
非常简短的文字,却异常明了的说明了一个数据库管理系统的核心原理,原文来自原文. Its a great question, and deserves a long answer. Most datab ...
- LeetCode 题解之Minimum Index Sum of Two Lists
1.题目描述 2.问题分析 直接是用hash table 解决问题 3.代码 vector<string> findRestaurant(vector<string>& ...
- C#中关于增强类功能的几种方式
C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...
- MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
- [翻译] JTCalendar
JTCalendar JTCalendar is a calendar control for iOS easily customizable. JTCalendar 是一个很容易定制的日历的控件. ...
- 最大公约数(GCD)与最小公倍数(LCM)的计算
给出两个数a.b,求最大公约数(GCD)与最小公倍数(LCM) 一.最大公约数(GCD) 最大公约数的递归: * 1.若a可以整除b,则最大公约数是b * 2.如果1不成立,最大公约数便是b ...
- 如何查找论文是否被SCI,EI检索(转)
转自 http://blog.sina.com.cn/s/blog_564978430100iqpp.html 学术界,尤其是国内学术界,把SCI,EI看得太重,很多大学都要求博士毕业要有SC ...
- python第三方库——xlrd和xlwt操作Excel文件学习
python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt Downloadin ...
- C++ 课堂作业1.0
c++第一次课堂作业点这里 题目要求:输入半径,计算圆的面积,在调用外部函数,无需使用类.