HTML 学习笔记 (drag & drop)
拖放(Drag & Drop)是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放。过去,我们用监听鼠标的Mousedown、Mouseove、Mouseup等事件来不停地获取鼠标的坐标来修改元素的位置,而现在html5原生的Drag &Drop事件(DnD),方便了许多,而且性能也有了提高。
如何使对象能够被拖动
为了使元素能够被拖动 需把要拖动元素的draggable 属性设置为true。
<img src="../img/0.jpg" draggable="true" id="image"/>
注意:在大多数浏览器中,a元素和img元素默认就是可以拖放的,但是为了保险起见,最好还是加上draggable属性。
拖动时触发的事件
dragstart:网页元素开始拖动时触发
drag:被拖动的元素在拖动过程中持续触发
dragenter:被拖动的元素进入目标元素时触发。应该在目标元素监听此事件。
dragleave:别拖动的元素离开目标元素时触发,应该在目标元素中监听该方法。
dragover:被拖动的元素停留在目标元素中时持续触发,应该在目标元素中监听该方法。
drap:被拖动元素或从文件系统选中的文件,拖放落下时触发。
dragend:网页元素拖动结束时触发。
注意:以上这些事件都可以指定回调函数。
dataTransfer 对象
拖动过程中,回调函数接受的事件参数,有一个dataTransfer属性。它指向一个对象,包含了与拖动相关的各种信息。
event.dataTransfer.setData(biaozhi,event.target.id);
draggableElement.addEventListener('dragstart', function(event) {
event.dataTransfer.setData('text', 'Helloweba');
});
上面代码在拖动开始时,在dataTransfer对象上储存一条文本信息,内容为“Helloweba”。当拖放结束时,可以用getData方法取出这条信息。
dataTransfer对象的属性:
effectAllowed:指定所允许的操作,可能的值为copy、move、link、copyLink、copyMove、linkMove、all、none和uninitialized(默认值,等同于all,即允许一切操作)。
files:包含一个FileList对象,表示拖放所涉及的文件,主要用于处理从文件系统拖入浏览器的文件。
types:储存在DataTransfer对象的数据的类型。
dataTransfer对象的方法:
setData(format, data):在dataTransfer对象上储存数据。第一个参数format用来指定储存的数据类型,比如text、url、text/html等
getData(format):从dataTransfer对象取出数据。
clearData(format):清除dataTransfer对象所储存的数据。如果指定了format参数,则只清除该格式的数据,否则清除所有数据。
setDragImage(imgElement, x, y):指定拖动过程中显示的图像。默认情况下,许多浏览器显示一个被拖动元素的半透明版本。参数imgElement必须是一个图像元素,而不是指向图像的路径,参数x和y表示图像相对于鼠标的位置。
dataTransfer对象允许在其上存储数据,这使得在被拖动元素与目标元素之间传送信息成为可能。
实例代码 在两个div之间拖动元素
实现拖放的过程
1.设置元素可拖放,即把draggable属性设置为true
2.拖动什么 ondragstart 和 setData()
image.ondragstart = function(event) {
event.dataTransfer.setData(biaozhi,event.target.id);
}
image为可拖动的元素
3.放到何处-ondargover (ondragover事件规定在何处放置被拖动的数据。默认地无法将数据/元素放置到其他元素中。如果要允许放置,必须阻止默认的处理方式。这里通过调用ondragover事件的event.preventDefault()方法:)
box1Div.ondragover = function(event) {
event.preventDefault();
}
4.进行放置
当放置被拖拽数据时会发生drop事件,例:
function dropeImage(event) {
event.preventDefault();
//从dataTransfer中取出包装好的数据 放在目标元素中
var data = event.dataTransfer.getData(biaozhi);
event.target.appendChild(document.getElementById(data));
}
完整例子(元素在两个div之间进行拖放)
HTML 代码
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="../js/drapAnddrop.js"></script>
<style type="text/css">
.box {
width: 400px;
height: 400px;
border: 1px solid orange;
}
#box1 {
background: darkgray;
}
</style>
</head>
<body>
<div id="box1" class="box"></div>
<div id="box2" class="box">
<img src="../img/0.jpg" draggable="true" id="image"/>
</div> </body>
</html>
Js代码
var box1Div;
var box2Div ,image;
var biaozhi = "text";
window.onload = function() {
box1Div = document.getElementById("box1");
box2Div = document.getElementById("box2");
image = document.getElementById("image");
//设置数据格式,就是包装要传递的数据在dataTransfer中
image.ondragstart = function(event) {
event.dataTransfer.setData(biaozhi,event.target.id);
} //放置结束
box1Div.ondragover = function(event) {
event.preventDefault();
}
box2Div.ondragover = function (event) {
event.preventDefault();
}
//进行放置
box1Div.ondrop = dropeImage;
box2Div.ondrop = dropeImage; }
function dropeImage(event) {
event.preventDefault();
//从dataTransfer中取出包装好的数据 放在目标元素中
var data = event.dataTransfer.getData(biaozhi);
event.target.appendChild(document.getElementById(data));
}
下面一段代码 是拖放本地文件进入网页中(本例子是拖放桌面上的一张图片进入网页元素)
HTML 代码
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#imageContainer {
width: 500px;
height: 500px;
background: darkgray;
}
</style>
<script src="../js/locationDrap.js"></script>
</head>
<body>
<div id="imageContainer"></div>
<div id="msgId"> </div>
</body>
</html>
Js 代码
var imageContainer;
window.onload = function () {
imageContainer = document.getElementById("imageContainer"); imageContainer.ondragover = function(event) {
event.preventDefault();
} imageContainer.ondrop = function(event) {
event.preventDefault();
// shouObj(event.dataTransfer.files);
var f = event.dataTransfer.files[0];
var fileReader = new FileReader();
fileReader.onload = function(event) {
// shouObj(event.target);
imageContainer.innerHTML = "<img src=\"" + fileReader.result +"\" />"
}
fileReader.readAsDataURL(f);
}
} function shouObj(obj) {
var s = "";
for (var k in obj) {
s += k + ":" + obj[k] + "<br />";
}
document.getElementById("msgId").innerHTML = s;
}
其中fileReader.result 就是经过加密的图片文件。
HTML 学习笔记 (drag & drop)的更多相关文章
- Win10/UWP新特性—Drag&Drop 拖出元素到其他App
在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...
- 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果
学习笔记---Javascript事件Event.IE浏览器下的拖拽效果 1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...
- jQuery 基础学习笔记总结(一)
Jquery 学习笔记 总结 感想: 此前在做站点时用到过jquery相关,特别是Ajax相关技术.但是并没有系统的进行学习和了解Jquery的强大的功能,趁这几天跟着资料基本的了解下Jquery的特 ...
- React Native 学习笔记--进阶(二)--动画
React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...
- SQLServer学习笔记系列1
一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...
- MySQL4.0命令操作学习笔记
声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...
- Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
---------------------------------------------------------------------------------------------------- ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- Android学习笔记(十七)——数据库操作(下)
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 这一次我们来试一试升级数据库,并进行数据库的CRUD操作,其中, C 代表添加(Create) ,R 代表查询 ...
随机推荐
- 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)
今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...
- PDF编辑神器
转自网络 http://files.cnblogs.com/files/quejuwen/pdfeditportable.zip
- struts2学习之旅三 权限管理和导航设计
1,权限管理的db设计和dao实现,尽量简单快速有效: db的设计如下:权限按照角色来赋给用户: 权限对应每一个具体的功能,有菜单级别的,有导航级别的,还有页面级别的功能: 涉及到权限的敏感操作一般都 ...
- 分布式搜索elasticsearch配置文件详解
elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来 ...
- java Io流向指定文件输入内容
package com.hp.io; import java.io.*; public class BufferedWriterTest{ public static void main(String ...
- Web项目从Oracle转为Mysql,fluentnhibernate-1.0和NHibernate2.1.0升级到NHibernate3.3的注意事项
1.Oracel数据库没有字段自增长属性,要实现自增长通常是通过查询序列或者触发器来实现的. 设置自增长主键 alter table SUB_SUBSCRIPTION add primary key( ...
- Struts2入门(四)——数据输入验证
一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我 ...
- Hibernate4.2.4入门(一)——环境搭建和简单例子
一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...
- 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?
为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...
- Android Weekly Notes Issue #224
Android Weekly Issue #224 September 25th, 2016 Android Weekly Issue #224 本期内容包括: Google Play的pre-lau ...