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 拖放实例 ...
随机推荐
- import同目录的py文件 :ModuleNotFoundError: No module named 'pdf'
报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/2.NLP/2.获取数据源和规范化/5.crea ...
- POJ-1325 Machine Schedule 二分图匹配 最小点覆盖问题
POJ-1325 题意: 有两台机器A,B,分别有n,m种模式,初始都在0模式,现在有k项任务,每项任务要求A或者B调到对应的模式才能完成.问最少要给机器A,B调多少次模式可以完成任务. 思路: 相当 ...
- CodeForces 601B Lipshitz Sequence
Lipshitz Sequence 题解: 可以通过观察得到,对于任意一个区间来说, 只有相邻的2个点的差值才会是区间的最大值. 具体观察方法,可以用数学分析, 我是通过画图得到的. 那么基于上面的观 ...
- poj 2912 Rochambeau(枚举+带权并查集)
题目链接:http://poj.org/problem?id=2912 题意:多个人玩石头剪刀布分成3组和一个裁判,每一组提前选定了自己出哪个手势,裁判可以随意出什么手势,问是否能够从给出的一系列石头 ...
- 2018湖南多校第二场-20180407 Barareh on Fire
Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...
- 模板类型推导、auto推导
effective modern c++ 果然是神书,干货满满,简单记录下. item1 模板推倒 典型的模板函数 temlate<class T> void fn(ParamType p ...
- 2019icpc南昌网络赛_I_Yukino With Subinterval
题意 给定一个序列,两种操作,单点修改,询问区间\([l,r]\)值域在\([x,y]\)范围内的连续段个数. 分析 原数组为\(a\),构造一个新的数组\(b\),\(b[i]=(a[i]==a[i ...
- kubernetes Value:将磁盘挂载到容器,PV,PVC
6.1.介绍卷 6.1.1.卷的类型 emptyDir-用于存储临时数据的简单空目录 hostPath-用于将目录从工作节点的文件系统挂载到pod nfs-挂载到pod中的NFS共享卷. 还有其他的如 ...
- 通过Service访问应用 (1)
目录 通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用 通过之前的操作,应用部署完成了,我们的Demo网站已 ...
- 2019本科se第一次作业-博客初体验-chris
(1)第一章 计算机专业术语总结: 软件=程序+软件工程.程序=数据结构+算法.软件.程序.用户.需求.应用程序.软件服务.源程序.软件架构(Software Architecture).软件设计与 ...