前言:

 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>&nbsp;(<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 原生拖放的更多相关文章

  1. HTML5原生拖放实例分析

    HTML5提供了原生拖放功能的JavaScript API,使用起来很方便. 兼容性: 对于PC端浏览器,Firefox.Chrome.Safari支持良好,而IE和Edge浏览器有些特性不支持,如I ...

  2. 深入理解javascript原生拖放

    × 目录 [1]拖放源 [2]拖放目标 [3]dataTransfer对象[4]改变光标 前面的话 拖放(drag-and-drop,DnD)其实是两个动作——拖和放.所以,它涉及到两个元素.一个是被 ...

  3. 《JAVASCRIPT高级程序设计》原生拖放和媒体元素

    一.原生拖放 最早在网页中引入javascript拖放功能的是IE4,当时,网页中只有两种对象可以拖放:图像和某些文本.而现在,几乎网页中的任何元素都可以拖放以及作为放置目标.下面介绍一些与拖放相关的 ...

  4. JavaScript原生拖放API入门总结

    一.背景 最早实现JavaScript拖放功能的是IE4的浏览器了.在当时,网页中只有图像和文本才能够进行拖放.IE5之后,拖放功能得到了扩展,形成了一个API(应用程序编程接口),使得几乎任何的标签 ...

  5. 用HTML5+原生js实现的推箱子游戏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 教你使用HTML5原生对话框元素,轻松创建模态框组件

    HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...

  7. HTML5原生拖拽/拖放⎡Drag & Drop⎦详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  8. HTML5原生拖拽/拖放(drag & drop)详解

    前言 拖放(drap && drop)在我们平时的工作中,经常遇到.它表示:抓取对象以后拖放到另一个位置.目前,它是HTML5标准的一部分.我从几个方面学习并实践这个功能. 拖放的流程 ...

  9. HTML5 之拖放(drag与drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. HTML5 拖放实例 ...

随机推荐

  1. maven构建springmvc过程中遇到的一些问题

    1.spring的配置文件,xsd不要配版本号 2.spring配置datasource的三种方式 3.springmvc与spring扫描注解的冲突 4.NoClassDefFoundError: ...

  2. NLP(五) 词性标注和文法

    NLTK内置词性标注器 用nltk.pos_tag()函数进行词性标注 import nltk nltk.download('averaged_perceptron_tagger') simpleSe ...

  3. Contour 学习笔记(二):使用级联功能实现蓝绿部署和金丝雀发布

    上篇文章介绍了 Contour 分布式架构的工作原理,顺便简单介绍了下 IngressRoute 的使用方式.本文将探讨 IngressRoute 更高级的用法,其中级联功能是重点. 1. Ingre ...

  4. 2019杭电多校 hdu6662 Acesrc and Travel (树形dp

    http://acm.hdu.edu.cn/showproblem.php?pid=6662 题意:有两个人在树上博弈,每个点节点有两个分数a[i]和b[i],先手先选择一个点,后手在先手选的点的相邻 ...

  5. 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】

      为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...

  6. 主席树区间第K大

    主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的. 1.不带修改的区间第K大. HDU-2665 ...

  7. Codeforces 938D Buy a Ticket

    Buy a Ticket 题意要求:求出每个城市看演出的最小费用, 注意的一点就是车票要来回的. 题解:dijkstra 生成优先队列的时候直接将在本地城市看演出的费用放入队列里, 然后直接跑就好了, ...

  8. Python学习之旅:使用Python实现Linux中的ls命令

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...

  9. java注解使用总结

    2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解编写代码,能够减轻java程序员繁琐配置的痛苦. 使用注解可以编写出更加易于维护,bug更少的代码. 注解是什么 ...

  10. spring boot使用常规发送邮件

    spring boot使用常规发送邮件 1.pom.xml文件依赖: <!-- javax.mail begin--> <dependency> <groupId> ...