在HTML5之前只能使用鼠标事件模拟出“拖放”效果;HTML5专门为拖放提供了7个事件句柄。

 被拖动的源对象可以触发的事件:

(1)ondragstart:源对象开始被拖动

(2)ondrag:源对象被拖动过程中(鼠标可能在移动也可能未移动)

(3)ondragend:源对象被拖动结束

拖动源对象可以进入到上方的目标对象可以触发的事件:

(1)ondragenter:目标对象被源对象拖动着进入

(2)ondragover:目标对象被源对象拖动着悬停在上方   注意:必须组织dragover事件的默认行为,才可能触发drop事件!  e.preventDefault();

(3)ondragleave:源对象拖动着离开了目标对象

(4)ondrop:源对象拖动着在目标对象上方释放/松手

范例一:被拖动的对象触发的三个事件(dragstart\drag\dragend)

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<img src="img/1.jpg" id="i1"/>
<script>
var i1=document.getElementById('i1');
i1.addEventListener('dragstart',function(){
console.log('你拖动了....');
});
i1.addEventListener('drag',function(){
console.log('你正在拖动....');
});
i1.addEventListener('dragend',function(){
console.log('你结束了拖动....');
});
</script>
</body>
</html>

范例二:拖动对象去指定目标对象(dragenter\dragover\drop\dragleave)

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
#d1{
width: 200px;
height: 200px;
border: 1px solid #555555;
margin:auto;
}
</style>
</head>
<body>
<img src="img/1.jpg" id="i1"/>
<div id="d1"></div>
<script>
var d1=document.getElementById('d1');
d1.addEventListener('dragenter',function(){
console.log('你将图片拖进目标对象....');
});
d1.addEventListener('dragover',function(e){
//在拖动对象悬停在目标对象时,我们阻止阻止浏览器的默认行为
//才能触发drop 释放事件
e.preventDefault();
console.log('你将图片悬停在目标对象上....');
});
d1.addEventListener('drop',function(){
console.log('你放下了图片....');
});
d1.addEventListener('dragleave',function(){
console.log('你拖出了图片....');
});
</script>
</body>
</html>

三、如何在拖动的源对象事件和目标对象事件间传递数据?

HTML5为所有的拖动相关事件提供了一个新的属性:e.dataTransfer   用于在源对象和目标对象的事件间传递数据。

源对象上的事件处理中保存数据:

e.dataTransfer.setData( k,  v );     //k-v必须都是string

目标对象上的事件处理中读取数据:

var v = e.dataTransfer.getData( k );

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body{
text-align: center;
}
#d1{
width: 100px;
height: 100px;
border: 1px solid #555555;
margin:auto;
}
</style>
</head>
<body>
<div id="d1">拖进来就删除</div>
<br/><br/><br/><br/>
<img src="img/1.jpg" class="res"/>
<img src="img/2.jpg" class="res"/>
<img src="img/3.jpg" class="res"/>
<img src="img/4.jpg" class="res"/>
<script>
//获取所有的图片对象
var imglist=document.querySelectorAll('.res');
for(var key in imglist){
//为每个图片绑定 "开始拖动"动作的 监听
//注意这时的拖动事件有个对象 e.dataTransfer
imglist[key].ondragstart=function(e){
console.log(e.dataTransfer);
/**e.dataTransfer对象属性
*
*files:获取对应文件列表
*items:获取对应元素列表
* types:
*
* 方法:
* setData(type,data)
* 参数
* type-设置当前数据的类型(标识——唯一)
* data-向dataTransfer对象设置的数据内容
* 作用——向dataTransfer对象存储数据
*
* getData(type)
* 参数
* type-设置当前数据的类型(标识——唯一)
*作用-从dataTransfer对象获取指定数据
*
*clearData()
* 作用-清空dataTransfer对象中所有存储的内容
*
* */
}
}
</script>
</body>
</html>

e.dataTransfer控制台显示:三个属性  三个主要方法

  

e.dataTransfer.setData('','');                e.dataTransfer.getData('','');  的拖动

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
body{
text-align: center;
}
#d1{
width: 100px;
height: 100px;
border: 1px solid #555555;
margin:auto;
}
</style>
</head>
<body>
<div id="d1"></div>
<br/><br/><br/><br/>
<img src="img/1.jpg" class="res"/>
<img src="img/2.jpg" class="res"/>
<img src="img/3.jpg" class="res"/>
<img src="img/4.jpg" class="res"/>
<script>
//获取所有的图片对象
var imglist=document.querySelectorAll('.res');
for(var key in imglist){
//为每个图片绑定 "开始拖动"动作的 监听
//注意这时的拖动事件有个对象 e.dataTransfer
imglist[key].ondragstart=function(e){
console.log(e.dataTransfer);
//向dataTransfer对象存储数据
e.dataTransfer.setData('image/png',this.src);
}
}
var d1=document.getElementById('d1');
//之前提过只有 dragover事件,里面设置了 e.preventDefault();才能触发drop事件
d1.ondragover=function(e){
e.preventDefault();
}
d1.ondrop=function(e){
var src=e.dataTransfer.getData('image/png');
console.log(src); //这里得到的是一个 http://localhost:63342/HTML_DAY05/img/1.jpg 字符串
var kw=src.match(/(img\/){1}\d{1}(.jpg)/g); //所以进行正则 得到 我们需要的字符串
console.log(kw);
/*
这里可以 用‘+’拼接 得到需要的字符串 后使用dom 查找到准确的图片对象 将其 拼接到 目标对象 ‘d1’下
kw="'"+kw+"'";
var img=document.querySelector("[src="+kw+"]");
*/
//这里 也可以用 `` 这个来书写 选择器 属于js特有的符号 但是引用变量时 要 ${}括起来
var img=document.querySelector(`[src="${kw}"]`);
this.appendChild(img); //如此 就可以出现真正拖动 效果 了。 }
</script>
</body>
</html>

效果图:

            

四.如何去实现拖拽文件进入一个网页。

提问:实现在网页中将客户端的图片移入网页中显示?

这里我们(不进行任何操作)直接拖入图片进入网页,会怎么显示呢?

解一:这里直接拖到网页的图片会在一个新打开的网页上显示,并不会出现在我们想要它出现的位置上。

我们知道ondragover的只有阻止默认浏览器行为e.preventDefault();才能触发ondrop事件。

所以我们想要从客户端上拖放图片到网页上我们指定的区域,也需要在网页上进行drop事件时取消浏览器的默认行为。

解二:如何让浏览器读取到我们的文件内容。

div.ondrop = function(e){

var f = e.dataTransfer.files[0]; //找到拖放的文件

var fr = new FileReader(); //创建文件读取器

fr.readAsURLData(f); //读取文件内容

fr.onload = function(){ //读取完成

img.src = fr.result; //使用读取到的数据

}

}

这里同样有个知识点:

HTML5新增的文件操作对象:

File: 代表一个文件对象

FileList: 代表一个文件列表对象,类数组

FileReader:用于从文件中读取数据

FileWriter:用于向文件中写出数据

 <!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
#container{
border:1px solid #aaa;
padding:10px;
margin:10px;
width: 500px;
height:500px;
}
</style>
</head>
<body>
<h3>拖放API的扩展知识——将本地文件拖到html页面上</h3>
<h3>请拖动您的照片到下方方框区域</h3>
<div id="container"></div>
<script>
document.ondragover=function(e){
e.preventDefault();
}
document.ondrop=function(e){
e.preventDefault();//在新窗口打开图片
}
//监听div.container的drop事件,设法读取到释放的图片 container.ondragover=function(e){
console.log(this);
e.preventDefault();
}
container.ondrop=function(e){
console.log('释放了.');
//当前的目标对象读取拖放源对象存储的数据
// console.log(e.dataTransfer); //显示有问题
// console.log(e.dataTransfer.files.length); //拖进来的图片数量 var f0= e.dataTransfer.files[0]; //文件对象
// console.log(f0);
var fr=new FileReader(); //创建文件读取器
// fr.readAsText(f0); //从文件中读取文本字符串
fr.readAsDataURL(f0); //从文件中读取url数据
fr.onload=function(){
console.log('读取文件完成');
console.log(fr.result);
var img=new Image();
img.src=fr.result;
container.appendChild(img);
}
}
</script>
</body>
</html>

  

html5的新特性——拖放API的更多相关文章

  1. 浅谈HTML5的新特性

    2014年10月29日,W3C宣布,经过接近8年的艰苦努力,HTML5标准规范终于制定完成. HTML5将会取代1999年制定的HTML 4.01.XHTML 1.0标准,使网络标准达到符合当代的网络 ...

  2. Atitti html5 h5 新特性attilax总结

    Atitti html5 h5 新特性attilax总结 Attilax觉得不错的新特性 3.语义Header和Footer (The Semantic Header and Footer) 8.占位 ...

  3. Atitit html5.1 新特性attilax总结

    Atitit html5.1 新特性attilax总结 9. 嵌入 header 和 footer1 7. 校验表单1 6. 浏览器的上下文菜单2 1. 响应式图像2 Attilax觉得还不错的心特性 ...

  4. JDK1.8新特性——Stream API

    JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...

  5. HTML5的新特性:范围样式,又叫做<style scoped>

    Chromium 最近实现了一个HTML5的新特性:范围样式,又叫做<style scoped> .开发者可以通过为根元素设定一个添加了scoped属性的style标签,来限制样式只作用于 ...

  6. 浅谈html5及其新特性

    什么是 HTML5? HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍 ...

  7. HTML5的新特性

    HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...

  8. HTML5 的新特性以及新标签的浏览器兼容问题

    新特性: HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加. 1)  拖拽释放(Drag and drop) API 2)  语义化更好的内容标签(heade ...

  9. 28个你必须知道的HTML5的新特性,技巧以及技术

    崭新新的页面布局 传统的: HTML5: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<f ...

随机推荐

  1. CMake的一些使用

    1. 使用QT加载CMake工程 打开QT,"文件"->"打开文件或项目"->选中CMakeLists.txt文件,出现对话框,单击下一步,点击&q ...

  2. 使用RestTemplate发送post请求

    最近使用RestTemplate发送post请求,遇到了很多问题,如转换httpMessage失败,中文乱码等,调了好久才找到下面较为简便的方法: RestTemplate restTemplate ...

  3. H5唤起APP一些坑

    $(function () { function _openAppUrl(appUrl){ var ua = navigator.userAgent.toLocaleLowerCase(), open ...

  4. NSURLSession访问网络数据

    1.NSMutableURLRequest的设置 //创建NSMutableURLRequest对象 NSMutableURLRequest *request = [NSMutableURLReque ...

  5. Javascript Promise入门

    是什么? https://www.promisejs.org/ What is a promise? The core idea behind promises is that a promise r ...

  6. unresolved inclusion in the java header in JNI

    eclipse的ndk开发环境建差不多后打开jni的samples里的hello-jni项目.添加native和运行都没有问题,但是打开hello-jni.c看到一片红: 光这一个文件牵涉的问题有下面 ...

  7. 调优SQL思路

    --调优SQL --sqlreview ->logshipping -> ag辅助副本 --查看正确的执行计划 打开实际的执行计划set statistics io on --查看错误的执 ...

  8. WebSQL 查询工具

    最近在写 WebSQL ,每次都在浏览器控制台执行 SQL 太费劲了,并且脑子不好使,总是忘记上次初始化的数据库是什么,所以写了一个特别简单的 WebSQL 可视化工具,说工具有点大了,就是为了方便, ...

  9. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  10. myeclipse2014新建maven项目

    1,首先安装maven,并配置. 2,新建maven project. 3,选择maven-archetype-webapp. 4,填写afrifact ID即为项目名称. 5,finish后 bui ...