拖拽上传

本文详细介绍了HTML5中的拖拽上传技术,包括Drag和Drop事件、File API和FormData接口。通过实例展示了如何利用这些技术实现AJAX文件上传,特别是拖拽上传图片。拖拽上传利用了HTML5的拖放事件以及FileList和FileReader接口,而FormData则方便地处理文件的二进制流数据,使得AJAX上传文件变得更加便捷。
摘要由CSDN通过智能技术生成

文章首发地址,阅读体验更好
拖拽上传应用主要使用了以下 HTML5技术:

  • Drag&Drop : HTML5基于拖拽的事件机制.

  • File API : 可以很方便的让 Web 应用访问文件对象,
    File API 包括FileList、Blob、File、FileReader、URI scheme,
    本文主要讲解拖拽上传中用到的 FileList 和 FileReader 接口。

  • FormData : FormData 是基于 XMLHttpRequest Level 2的新接口,
    可以方便 web 应用模拟 Form 表单数据,最重要的是它支持文件的二进制流数据,
    这样我们就能够通过它来实现 AJAX 向后端发送文件数据了。

Drag和Drop

关于这个拖拽上传,其实国外有很多网站已经有这样的应用,
最早推出拖拽上传应用的是 Gmail,
它支持标准浏览器下拖拽本地文件到浏览器中作为邮件的附件发送,
但其实现在利用HTML5的功能实现,主要借助于新版支持的浏览器来实现,
IE还是弱很多

H5的Drag和Drop事件:

过去我们想实现网页中的拖拽效果,基本上都是使用DOM事件模型中的mousedown、mousemove、mouseup的事件监听来模拟拖拽效果,为了实现实时的拖拽移动效果,还要不停地获取鼠标的坐标,还要不停的修改元素的位置,代码要堆很多,而且性能上也很不好(不停地修改元素位置会导致页面reflow,除非绝对定位),现在有了h5原生的Drag和Drop事件,可以自由的玩耍了。

Drag和Drop包括以下事件:

  • dragstart: 要被拖拽的元素开始拖拽时触发,这个事件对象是被拖拽元素
  • dragenter: 拖拽元素进入目标元素时触发,这个事件对象是目标元素
  • dragover: 拖拽某元素在目标元素上移动时触发,这个事件对象是目标元素
  • dragleave: 拖拽某元素离开目标元素时触发,这个事件对象是目标元素
  • dragend: 在drop之后触发,就是拖拽完毕时触发,这个事件对象是被拖拽元素
  • drop:将被拖拽元素放在目标元素内时触发,这个事件对象是目标元素完成一次成功页面元素拖拽的行为事件过程:

dragstart –> dragenter –> dragover –> drop –> dragend

//要想实现拖拽,首页需要阻止浏览器默认行为,一共四个事件
$(document).on({
   
	dragleave:function(e){
   	//拖离
		e.preventDefault();
	},
	drop:function(e){
   		//放下
		e.preventDefault();
	},
	dragenter:function(e){
   	//拖进
		e.preventDefault();
	},
	dragover:function(e){
   	//拖来拖去
		e.preventDefault();
	}
});

获取文件数据H5-File-API

File API 中的 FileList 接口,它主要通过两个途径获取本地文件列表:
一种是 <input type="file">的表单形式,
一种是 e.dataTransfer.files 拖拽事件传递的文件信息

var fileList = e.dataTransfer.files;

// 使用files 方法将会获取到拖拽文件的数组形势的数据,每个文件占用一个数组的索引,如果该索引不存在文件数据,将返回 null 值。可以通过length属性获取文件数量.
var fileNum = fileList.length;

// 文件类型
fileList[0].type.indexOf (’image’);

AJAX 上传图片(file.getAsBinary & FormData)

file.getAsBinary获取文件流很简单,但是要想上传数据,就要模拟一下表单的数据格式了,首先看看模拟表单的js代码, FormData模拟表单数据时更是简洁,不用麻烦的去拼字符串,而是直接将数据 append 到 formdata 对象中即可

xhr = new XMLHttpRequest();
xhr.open("post", "test.php", true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

var fd 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值