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 拖放实例 ...
随机推荐
- 【HDU5409】CRB and Graph 边双联通 子树最值
HDU # 题意 有一个简单图,n个点,m条边.对于每条割边,求出删去这条边后,在两个联通块中各取一个u,v.使得u<v,并且u尽量大而v尽量小. # 思路 求出边双联通是肯定的. 答案的限制条 ...
- CodeForces 980 C Posterized
Posterized 题意:将[0,255] 分成 若干段, 每一段的长度最多为k, 每一个数只能被放进一个段里, 然后每一段的数组都可以被这一段最小的数字表示, 求最小的字典序. 题解:每次一个访问 ...
- 一篇文章看懂JS执行上下文
壹 ❀ 引 我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.lo ...
- input上传按钮的优化
在使用input标签按钮的时候,<input type="file" value="" /> 显示很难看,怎么办? 使用label <li c ...
- Dijkstra算法的Java实现
package main.java; import main.java.utils.GraphUtil; import java.util.ArrayDeque; import java.util.L ...
- 当React开发者初次走进React-Native的世界
RN千机变 1.技术体系问题 RN和React共用一套抽象层,相对于前端,RN其实更接近Node的运行环境 ReactNative =React +IOS +Android 看RN文档时,我会发现入门 ...
- .Net基础篇_学习笔记_第六天_异常捕获复习及断点调试
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 表达式树练习实践:C# 五类运算符的表达式树表达
目录 表达式树练习实践:C# 运算符 一,算术运算符 + 与 Add() - 与 Subtract() 乘除.取模 自增自减 二,关系运算符 ==.!=.>.<.>=.<= 三 ...
- 树、图、堆、STL(来自菜鸡的"炒鸡"干粮)
树.图.堆.STL 图论基础 简单图: 没有自环,两个顶点之间最多只有一条边. 完全图: 一个简单图,每两个顶点之间都有一条边.一共有(n-1)*n/2条边. 二分图: 一个简单图,设G=(V,E)是 ...
- 微信支付中分账功能 填坑指南V1
公司是做电商的,近期开发了一款小程序,准备线上线下同步销售玩具.这里就涉及到微信支付的功能,网上有很多教程,官方也有文档和Demo,因此微信支付还是比较容易实现的. 由于我们公司是和其他公司合作运营的 ...