经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
HTML5拖拽文件上传的示例代码
来源:jb51  时间:2021/3/8 11:19:19  对本文有异议

上传文件

HTML5新增了文件API,提供客户端本地操作文件的可能.

我们可以通过file表单或拖放操作选择文件,还可以通过JavaScript读取文件的名称、大小、类型、和修改时间.

file类型的input表单新增了files属性,保存我们上传文件的信息,如果要实现多文件上传,可以设置input的multiple属性.

可以使用accept属性规定文件上传的MIME类型 例如’image/jpeg’

  1. <form action="#">
  2. <div class="form-group">
  3. <label for="input_1">请选择文件</label>
  4. <input id="input_1" class="form-control" name="input_1" type="file">
  5. </div>
  6. <div class="form-group">
  7. <button id="btn_1" class="btn btn-default" type="button">读取文件信息</button>
  8. </div>
  9. </form>
  10. <pre id="result"></pre>
  11. </div>
  12. <script>
  13. var btn = document.querySelector('#btn_1');
  14. var input = document.querySelector('#input_1');
  15. btn.addEventListener('click', function() {
  16. // 获取文件域中选择的文件
  17. // var file = input.files[0];
  18. var file = input.files.item(0);
  19. if (file) {
  20. result.innerHTML =
  21. '文件名:' + file.name + '\n文件最近修改时间:' + file.lastModifiedDate+ '\n文件类型:' + file.type + '\n文件大小:' + file.size + '字节'
  22. } else {
  23. result.innerHTML = '没有选择任何文件';
  24. }
  25. });
  26. </script>

页面拖拽操作

对于被拖拽的元素,HTML5增加了三个事件用于监听拖拽的过程

  • dragstart 拖拽开始
  • drag 正在拖拽
  • dragend 拖拽结束
  1. <body>
  2. <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div>
  3. <div id="two" style="width: 100px;height: 100px;border: 1px solid blue" draggable="true"></div>
  4. </body>
  5. <script type="text/javascript">
  6. two.ondragstart = function(e){
  7. // e.preventDefault();
  8. console.log(e);
  9. e.dataTransfer.setData("Text",e.target.id);
  10. console.log(e.dataTransfer.getData("Text",e.target.id));
  11. one.innerHTML = '开始'
  12. }
  13. two.ondrag = function(e){
  14. one.innerHTML += '拖动中'
  15. }
  16. two.ondragend = function(e){
  17. one.innerHTML = '结束'
  18. }
  19. </script>

想要拖拽元素,必须设置draggable属性

页面默认的动作是拖拽后回到原位

在拖动阶段,我们可以存储被拖动元素的属性或者状态到事件对象的dataTransfer中,如果出现跳转,则是浏览器默认的事件被触发,我们需要使用e.preventDefault()来阻止默认事件。

投放区的事件

对于被拖的元素而言,拖向何处则为投放区,投放区的事件如下:

  • dragenter 被拖放元素进入
  • dragover 被拖放元素移动
  • dragleave 被拖放元素离开
  1. <body>
  2. <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div>
  3. <div id="two" style="width: 100px;height: 100px;border: 1px solid blue" draggable="true"></div>
  4. </body>
  5. <script type="text/javascript">
  6. one.ondragenter = function(e){
  7. // e.preventDefault();
  8. console.log(e);
  9. one.innerHTML = '开始'
  10. }
  11. one.ondragover = function(e){
  12. one.innerHTML += '拖动中'
  13. }
  14. one.ondragleave = function(e){
  15. one.innerHTML = '结束'
  16. }
  17. </script>

而drop则是监听被拖拽物拖拽到投放区并松开鼠标的事件,他可以接收到dataTransfer中的数据,所以我们的页面内拖拽可以写成如下效果:

  1. <style type="text/css">
  2. *{
  3. box-sizing: border-box;
  4. }
  5. </style>
  6. <body>
  7. <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div>
  8. <div id="two" style="width: 100px;height: 100px;border: 1px solid blue;display: flex;">
  9. <div style="width: 50px;height: 100px;border:1px solid black;">第一个</div>
  10. <div style="width: 50px;height: 100px;border:1px solid pink;">第二个</div>
  11. </div>
  12. </body>
  13. <script type="text/javascript">
  14. one.ondragover = function(e) {
  15. e.preventDefault();
  16. }
  17. two.onmousedown = function(e){
  18. e.target.draggable = true;
  19. e.target.ondragstart = function(ev) {
  20. ev.dataTransfer.setData("Text", ev.target.innerHTML);
  21. }
  22. e.target.ondragend = function(){
  23. two.removeChild(this)
  24. }
  25. }
  26. one.ondrop = function(e) {
  27. var div = document.createElement('div')
  28. div.style = "width: 50px;height: 100px;border:1px solid black;"
  29. div.innerHTML = e.dataTransfer.getData("Text")
  30. this.appendChild(div)
  31. }
  32. </script>
  • 对于谷歌浏览器,e.dataTransfer.setData(key,value)会导致拖拽到投放区域外的时候浏览器默认搜索设置的值。如果需要,我们可以屏蔽它
  • 对于火狐浏览器,没有e.dataTransfer.setData(key,value)还不行。我们可以直接设置键值对为null,"";
  • 最新版本的谷歌和火狐浏览器没有发现问题
  • drop事件并不能直接触发,因为默认的松开鼠标我们的拖拽物会返回原来的位置,并不会掉落,所以我们应该阻止投放区域的默认事件.

拖拽文件上传

经过观察,事件对象中的dataTransfer也存在files属性,我们可以用熟悉的方法上传拖拽进来的文件:

  1. <body>
  2. <div id="one" style="width: 300px;height: 300px;border: 1px solid red"></div>
  3. </body>
  4. <script type="text/javascript">
  5. one.ondragover = function(e) {
  6. e.preventDefault();
  7. }
  8. one.ondrop = function(e) {
  9. e.preventDefault()
  10. console.log(e.dataTransfer.files[0]);
  11. }
  12. </script>

然后做Ajax文件上传即可

  1. one.ondrop = function(e) {
  2. e.preventDefault()
  3. var file = e.dataTransfer.files[0];
  4. var formData = new FormData();
  5. formData.append("aa", file);
  6. var xml = new XMLHttpRequest();
  7. xml.open("post", url, false);
  8. xml.send(formData);
  9. }

到此这篇关于HTML5拖拽文件上传的示例代码的文章就介绍到这了,更多相关HTML5拖拽上传内容请搜索w3xue以前的文章或继续浏览下面的相关文章,希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号