HTML5 原生拖放
前言:
HTML5提供专门的拖拽与拖放的API,可以方便的指定某个元素可拖动,可以创建自定义的可拖动元素和放置目标
相关知识点:
1.拖放事件
拖放元素时,将依次触发下列事件
- dragstart 按下鼠标并开始移动鼠标时,在被拖放元素上触发
- drag 元素被拖动期间持续触发
- dragend 拖动停止时触发
当元素被拖动到一个有效放置目标时,下列事件依次发生
- dragenter 只要有元素被拖放到放置目标上时触发
- dragover 被拖放元素在放置目标范围内移动时,持续触发
- drop或dragleave 元素被拖放到放置目标中,触发drop事件;元素被拖出放置目标时,触发dragleave事件
2.自定义放置目标
假设有一个ID为‘droptarget’的<div>元素,利用一下代码可以将它变为一个放置目标
var droptarget=$("#droptarget")
droptarget.bind("dragover",function (event) {
event.preventDefault();
})
droptarget.bind("dragenter",function (event) {
event.preventDefault();
})
droptarget.bind("drop",function (event) {
event.preventDefault();
})
以上代码执行后,当拖放元素移动到放置目标上时,光标会变成允许放置的符号,释放鼠标就会触发drop事件
注意:在FireFox3.5+中,放置事件的默认行为是打开被放到放置目标的url,也就是说,将图片拖放到放置目标的时,页面会转向图像文件,而如果将文本放到当放置目标的时候,会因为无效URL而导致错误。因此,为了FireFox正常拖放,还要取消drop事件默认行为,阻止它打开URL
3.dataTransfer 对象:拖放操作实现数据交换的媒介,使用一般为Event.dataTransfer。
主要有两种方法:getData()和setData(),HTML5为此甲加以扩展,允许指定各种MIME类型,考虑跨流浪器问题,我们可以这样子使用:
var dataTransfer=event.dataTransfer;
// 读取URL
3 var url=dataTransfer.getData('url')||dataTransfer.getData('text/uri-list');
4 //读取文本
5 var text=dataTransfer.getData('Text')
注意:在Firefox中,clearData()和setData()方法只能在ondragstart事件处理程序中调用。在其他情况下使用clearData()和setData()方法都会引发异常。
一定要将短数据放在前面,因为在IE10及之前版本不支持MIME类型名,会抛出错误;FireFox5.0版本之前不能正确将“text”类型映射为‘text/plain’,却可以将“Text”(注意大写)类型映射为‘text/plain’
4.dataEffect和effecAllowed
实例:
为了更方便理解,实现了一个简单的demo
demo源代码地址:戳 here
源代码:
html代码:
<div class="container">
<div class="favbox" id='droptarget'>
<p style='margin:1px;font-size: 0.8rem;'>收集箱</p>
<span><i class="fa fa-heart"></i> (<span id='favnum'>0</span>)</span>
</div>
<div class="gallery">
<a href="images/image-1.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="data:images/image-1.jpg" alt="" class="img-thumbnail img-fluid"></a>
<a href="images/image-2.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="data:images/image-2.jpg" alt="" class="img-thumbnail img-fluid"></a>
<a href="images/image-3.jpg" class="image-link dragitem" draggable="true" data-lightbox="roadtrip" title="点击查看大图"> <img src="data:images/image-3.jpg" alt="" class="img-thumbnail img-fluid"></a>
</div>
</div>
js代码:
$(function () {
new DragUtil('.dragitem', '#droptarget')
});
var DragUtil = function (dragList, dropEle) {
/* 拖拽对象 */
this.$draglist = $(dragList)
/* 放置目标 */
this.$droptarget = $(dropEle)
this.$dragEle = null;
this.$draglist.each(function (index, item) {
item.ondragstart = function (e) {
/*拖拽开始*/
e.dataTransfer.effectAllowed = "move";
if (e.target.nodeName === 'A') {
this.$dragEle = $(e.target)
} else {
this.$dragEle = $(e.target)
.parents('a')[0]
}
e.dataTransfer.setData("url", this.$dragEle);
return true;
};
$(item)
.bind('dragend', function (e) {
/*拖拽结束*/
this.$dragEle.remove()
return false
});
})
this.$droptarget.bind("dragover", function (event) {
/*拖拽元素在放置目标上移动的时候*/
event.preventDefault();
return true;
})
this.$droptarget.bind("dragenter", function (event) {
/*拖拽元素在放置目标上的时候*/
this.style.color = "red";
return true;
})
this.$droptarget.bind("drop", function (e) {
/*拖拽元素放置到放置目标,取消默认行为!*/
e.preventDefault();
var dataTransfer = e.originalEvent.dataTransfer
var imgUrl = dataTransfer.getData('url') || dataTransfer.getData(
'text/uri-list')
$(this)
.append('<img src="' + imgUrl + '">')
var favnum = $('#favnum')
.html();
favnum++;
$("#favnum")
.html(favnum)
this.style.color = "#666";
return true;
})
}
结束语:
根据自己的简单的测试,demo在chrome,FireFox,IE均可实现,文中注意点是比较重要的部分,故重点高亮了,然而在FireFox,虽然不报错,但暂时还不能正确地利用dataTransfer进行数据交换,有空一定将此补上~~
感谢阅读。文中要是有表述不准确的地方,欢迎指正。
HTML5 原生拖放的更多相关文章
- HTML5原生拖放实例分析
HTML5提供了原生拖放功能的JavaScript API,使用起来很方便. 兼容性: 对于PC端浏览器,Firefox.Chrome.Safari支持良好,而IE和Edge浏览器有些特性不支持,如I ...
- 深入理解javascript原生拖放
× 目录 [1]拖放源 [2]拖放目标 [3]dataTransfer对象[4]改变光标 前面的话 拖放(drag-and-drop,DnD)其实是两个动作——拖和放.所以,它涉及到两个元素.一个是被 ...
- 《JAVASCRIPT高级程序设计》原生拖放和媒体元素
一.原生拖放 最早在网页中引入javascript拖放功能的是IE4,当时,网页中只有两种对象可以拖放:图像和某些文本.而现在,几乎网页中的任何元素都可以拖放以及作为放置目标.下面介绍一些与拖放相关的 ...
- JavaScript原生拖放API入门总结
一.背景 最早实现JavaScript拖放功能的是IE4的浏览器了.在当时,网页中只有图像和文本才能够进行拖放.IE5之后,拖放功能得到了扩展,形成了一个API(应用程序编程接口),使得几乎任何的标签 ...
- 用HTML5+原生js实现的推箱子游戏
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 教你使用HTML5原生对话框元素,轻松创建模态框组件
HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...
- HTML5原生拖拽/拖放⎡Drag & Drop⎦详解
前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...
- HTML5原生拖拽/拖放(drag & drop)详解
前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...
- HTML5 之拖放(drag与drop)
拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...
随机推荐
- Reactive(2) 响应式流与制奶厂业务
目录 再谈响应式 为什么Web后端开发的,对 Reactive 没有感觉 Java 9 支持的 Reactive Stream 范例 小结 扩展阅读 再谈响应式 在前一篇文章从Reactive编程到& ...
- 2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest)
2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest) Problem A. M ...
- CodeM资格赛 优惠券
[编程|1000分] 优惠券 时间限制:1秒空间限制:32768K 题目描述 美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买.每种优惠券有一个唯一的正整数编号.每个人可以拥有多张优惠券,但 ...
- 如何设计web系统的监控
如何使用httpclient设计开发一套web系统监控? 我之前有实现和写过关于运维和开发两个层面的监控系统的文章(https://www.cnblogs.com/zhikou/p/8576891.h ...
- Linux入门基础之一
Linux 入门基础 一.Linux 系统安装 安装方法网上很多,请自行百度 二.Linux 基本操作 2.1.GNOME图形界面基本操作 操作类似于Windows系统操作 打开每一个文件夹都会打开一 ...
- 2018阿里-研发工程师JAVA Software Engineer, Java
岗位描述Job Description如果你想了解JAVA开发在阿里巴巴互联网生态系统中无与伦比的应用广度与深度: 如果你对基础技术感兴趣,你可以参与基础软件的设计.开发和维护,如分布式文件系统.缓存 ...
- 扩展mybatis和通用mapper,支持mysql的geometry类型字段
因项目中需要用到地理位置信息的存储.查询.计算等,经过研究决定使用mysql(5.7版本)数据库的geometry类型字段来保存地理位置坐标,使用虚拟列(Virtual Generated Colum ...
- (一)ArrayList集合源码解析
一.ArrayList的集合特点 问题 结 论 ArrayList是否允许空 允许 ArrayList是否允许重复数据 允许 ArrayList是否有序 有序 ArrayList是否线程安全 ...
- Winform中在FastReport的PreviewControl预览控件中对report控件模板中控件值进行修改
场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Winform中跨窗体设置Zedgraph的属性并刷新曲线图
场景 在使用ZedGraph时,经常有图形选项功能,设置曲线图相关属性后, 点击保存会设置另一个窗体的属性并刷新图. 效果 实现 在设置图形的选项的类中,声明委托和事件 //委托的定义 public ...