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 拖放实例 ...
随机推荐
- spring-cloud-kubernetes与k8s的configmap
本文是<spring-cloud-kubernetes实战系列>的第六篇,主要内容是在kubernetes上部署一个java web应用,该应用使用了spring-cloud-kubern ...
- P1640 [SCOI2010]连续攻击游戏 二分图构造
https://www.luogu.org/problemnew/show/P1640 题意 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10 ...
- android日志搜集原理及方案比较
说明: 本文只讨论Log日志,而不是应用的埋点日志. Android 日志架构 用一张图来了解Android Log的架构: 这里涉及到三个进程: APP进程: 调用Log的接口打日志,最终通过soc ...
- python实现去掉空行
# coding = utf-8def clearBlankLine(): file1 = open('text1.txt', 'r', encoding='utf-8') # 要去掉空行的文件 fi ...
- 简单粗暴详细讲解javascript实现函数柯里化与反柯里化
函数柯里化(黑人问号脸)???Currying(黑人问号脸)???妥妥的中式翻译既视感:下面来一起看看究竟什么是函数柯里化: 维基百科的解释是:把接收多个参数的函数变换成接收一个单一参数(最初函数的第 ...
- mybatis plus使用redis作为二级缓存
建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...
- String对象为什么不可变
转载:https://www.cnblogs.com/leskang/p/6110631.html 一.什么是不可变对象? As we all know, 在Java中, String类对象是不可变的 ...
- spring boot监听器的实现
spring boot监听器的实现 如下所示: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContex ...
- 字符串和Date互相转化
话不多说,上程序,如图: public class TestDate { public static void main(String[] args) throws ParseException { ...
- Airflow:TypeError an integer is required (got type NoneType) 一次诡异问题排查
当使用rabbitmq作为airflow的broker的时候,启动scheduler,即执行airflow scheduler命令的时候抛出以下异常: Traceback (most recent ...