拖放(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)的更多相关文章

  1. Win10/UWP新特性—Drag&Drop 拖出元素到其他App

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

  2. 学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

    学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcE ...

  3. jQuery 基础学习笔记总结(一)

    Jquery 学习笔记 总结 感想: 此前在做站点时用到过jquery相关,特别是Ajax相关技术.但是并没有系统的进行学习和了解Jquery的强大的功能,趁这几天跟着资料基本的了解下Jquery的特 ...

  4. React Native 学习笔记--进阶(二)--动画

    React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...

  5. SQLServer学习笔记系列1

    一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...

  6. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...

  7. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  8. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  9. Android学习笔记(十七)——数据库操作(下)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 这一次我们来试一试升级数据库,并进行数据库的CRUD操作,其中, C 代表添加(Create) ,R 代表查询 ...

随机推荐

  1. C# Word中设置/更改文本方向

    C# Word中设置/更改文本方向 一般情况下在Word中输入的文字都是横向的,今天给大家分享两种方法来设置/更改一个section内的所有文本的方向及部分文本的方向,有兴趣的朋友可以试下. 首先,从 ...

  2. 1元搭建自己的云服务器&解析域名

    最近在学做微信开发,没有自己的域名和服务器就不得不寄人篱下,索性自己就到云主机上搭建了个服务器,但是水平有限弄了一个下午~~有自己的域名和服务器的好处相信不用我多说了.比如日后可以有自己域名的个性博客 ...

  3. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  4. CSS教程:div垂直居中的N种方法以及多行文本垂直居中的方法

    在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...

  5. 高分辨率下IE浏览器缩放导致出现右侧滚动条问题的解决

    0 问题描述 由于需要演示触控操作,采购了SurfacePro,SurfacePro的推荐分辨率为2736×1824,且默认缩放比例为200%,IE浏览器的默认缩放比例也是200%,这样就导致右侧出现 ...

  6. ChatSecure

    ChatSecure是一个免费和开源消息传递应用程序的特性 OTR加密在 XMPP. 你可以连接到现有的谷歌帐户或创建新帐户 公共XMPP服务器(包括通过 Tor),甚至 连接到您自己的服务器额外的安 ...

  7. css图片精灵

    <ul> <li class="top"> <em>01</em> <p><a href="http:/ ...

  8. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  9. 基于Cesium1.26地图API下的GeoServer2.9.0服务器跨域设置

    遇到的问题: 最近基于Cesium来做3D模型的地图开发,在访问自己发布的WMS服务之后,遇到了GeoServer跨域问题. 调用这个WMS服务的时候,浏览器(我用Chrome)开发者工具报错: 控制 ...

  10. ArcGIS Engine开发之视图同步

    数据视图与布局视图的同步 数据视图与布局视图的同步,首先要保证数据的一致性,其次就是数据显示范围的一致性.该同步主要涉及IMapControl接口的OnMapReplaced事件和OnAfterScr ...