HTML5拖拽文件上传的示例代码
程序员文章站
2022-03-04 09:41:08
HTML5拖拽文件上传的示例代码这篇文章主要介绍了HTML5拖拽文件上传的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 21-03-04...
上传文件
html5新增了文件api,提供客户端本地操作文件的可能.
我们可以通过file表单或拖放操作选择文件,还可以通过javascript读取文件的名称、大小、类型、和修改时间.
file类型的input表单新增了files属性,保存我们上传文件的信息,如果要实现多文件上传,可以设置input的multiple属性.
可以使用accept属性规定文件上传的mime类型 例如’image/jpeg’
<form action="#"> <div class="form-group"> <label for="input_1">请选择文件</label> <input id="input_1" class="form-control" name="input_1" type="file"> </div> <div class="form-group"> <button id="btn_1" class="btn btn-default" type="button">读取文件信息</button> </div> </form> <pre id="result"></pre> </div> <script> var btn = document.queryselector('#btn_1'); var input = document.queryselector('#input_1'); btn.addeventlistener('click', function() { // 获取文件域中选择的文件 // var file = input.files[0]; var file = input.files.item(0); if (file) { result.innerhtml = '文件名:' + file.name + '\n文件最近修改时间:' + file.lastmodifieddate+ '\n文件类型:' + file.type + '\n文件大小:' + file.size + '字节' } else { result.innerhtml = '没有选择任何文件'; } }); </script>
页面拖拽操作
对于被拖拽的元素,html5增加了三个事件用于监听拖拽的过程
- dragstart 拖拽开始
- drag 正在拖拽
- dragend 拖拽结束
<body> <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div> <div id="two" style="width: 100px;height: 100px;border: 1px solid blue" draggable="true"></div> </body> <script type="text/javascript"> two.ondragstart = function(e){ // e.preventdefault(); console.log(e); e.datatransfer.setdata("text",e.target.id); console.log(e.datatransfer.getdata("text",e.target.id)); one.innerhtml = '开始' } two.ondrag = function(e){ one.innerhtml += '拖动中' } two.ondragend = function(e){ one.innerhtml = '结束' } </script>
想要拖拽元素,必须设置draggable属性
页面默认的动作是拖拽后回到原位
在拖动阶段,我们可以存储被拖动元素的属性或者状态到事件对象的datatransfer中,如果出现跳转,则是浏览器默认的事件被触发,我们需要使用e.preventdefault()来阻止默认事件。
投放区的事件
对于被拖的元素而言,拖向何处则为投放区,投放区的事件如下:
- dragenter 被拖放元素进入
- dragover 被拖放元素移动
- dragleave 被拖放元素离开
<body> <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div> <div id="two" style="width: 100px;height: 100px;border: 1px solid blue" draggable="true"></div> </body> <script type="text/javascript"> one.ondragenter = function(e){ // e.preventdefault(); console.log(e); one.innerhtml = '开始' } one.ondragover = function(e){ one.innerhtml += '拖动中' } one.ondragleave = function(e){ one.innerhtml = '结束' } </script>
而drop则是监听被拖拽物拖拽到投放区并松开鼠标的事件,他可以接收到datatransfer中的数据,所以我们的页面内拖拽可以写成如下效果:
<style type="text/css"> *{ box-sizing: border-box; } </style> <body> <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div> <div id="two" style="width: 100px;height: 100px;border: 1px solid blue;display: flex;"> <div style="width: 50px;height: 100px;border:1px solid black;">第一个</div> <div style="width: 50px;height: 100px;border:1px solid pink;">第二个</div> </div> </body> <script type="text/javascript"> one.ondragover = function(e) { e.preventdefault(); } two.onmousedown = function(e){ e.target.draggable = true; e.target.ondragstart = function(ev) { ev.datatransfer.setdata("text", ev.target.innerhtml); } e.target.ondragend = function(){ two.removechild(this) } } one.ondrop = function(e) { var div = document.createelement('div') div.style = "width: 50px;height: 100px;border:1px solid black;" div.innerhtml = e.datatransfer.getdata("text") this.appendchild(div) } </script>
- 对于谷歌浏览器,e.datatransfer.setdata(key,value)会导致拖拽到投放区域外的时候浏览器默认搜索设置的值。如果需要,我们可以屏蔽它
- 对于火狐浏览器,没有e.datatransfer.setdata(key,value)还不行。我们可以直接设置键值对为null,"";
- 最新版本的谷歌和火狐浏览器没有发现问题
- drop事件并不能直接触发,因为默认的松开鼠标我们的拖拽物会返回原来的位置,并不会掉落,所以我们应该阻止投放区域的默认事件.
拖拽文件上传
经过观察,事件对象中的datatransfer也存在files属性,我们可以用熟悉的方法上传拖拽进来的文件:
<body> <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div> </body> <script type="text/javascript"> one.ondragover = function(e) { e.preventdefault(); } one.ondrop = function(e) { e.preventdefault() console.log(e.datatransfer.files[0]); } </script>
然后做ajax文件上传即可
one.ondrop = function(e) { e.preventdefault() var file = e.datatransfer.files[0]; var formdata = new formdata(); formdata.append("aa", file); var xml = new xmlhttprequest(); xml.open("post", url, false); xml.send(formdata); }
到此这篇关于html5拖拽文件上传的示例代码的文章就介绍到这了,更多相关html5拖拽上传内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!