返回顶部
首页 > 资讯 > 前端开发 > html >原生JavaScript如何实现具有进度监听的文件上传预览组件
  • 220
分享到

原生JavaScript如何实现具有进度监听的文件上传预览组件

2024-04-02 19:04:59 220人浏览 八月长安
摘要

本篇文章为大家展示了原生javascript如何实现具有进度监听的文件上传预览组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。原生js的使用通过面向对象的方式实现

本篇文章为大家展示了原生javascript如何实现具有进度监听的文件上传预览组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

原生js的使用

通过面向对象的方式实现一个文件上传预览的组件,该组件利用FileReader来实现文件在前端的解析,预览,读取进度等功能,并对外暴露相应api来实现用户自定义的需求,比如文件上传,进度监听,自定义样式,读取成功回调等。

组件设计架构如下:

原生JavaScript如何实现具有进度监听的文件上传预览组件

涉及的核心知识点如下:

  1. 闭包:减少变量污染,缩短变量查找范围

  2. 自执行函数

  3. file API:对文件进行读取,解析,监控文件事件

  4. DocumentFragment API:主要用来优化dom操作

  5. minix :用来实现对象混合

  6. 正则表达式:匹配文件类型

  7. class :类组件

github地址

用原生js实现具有进度监听的文件上传预览组件

Demo演示

原生JavaScript如何实现具有进度监听的文件上传预览组件
原生JavaScript如何实现具有进度监听的文件上传预览组件

原生JavaScript如何实现具有进度监听的文件上传预览组件

原生JavaScript如何实现具有进度监听的文件上传预览组件

使用:

<div id="test"></div> <script src="./js/xjFile.js"></script> <script>     new xjFile({         el: '#test', // 不填则直接默认挂在body上         accept: 'image/png', // 可选         clsName: 'xj-wrap', // 可选         beforeUpload: function(e) { console.log(e) }, // 可选         onProgress: function(e) { console.log(e) }, // 可选         onLoad: function(e) { console.log(e) }, // 可选         onError: function(e) { console.error('文件读取错误', e) } // 可选     }); </script>

CSS代码:

.xj-wrap {             position: relative;             display: inline-block;             border: 1px dashed #888;             width: 200px;             height: 200px;             border-radius: 6px;             overflow: hidden;         }         .xj-wrap::before {             content: '+';             font-size: 36px;             position: absolute;             transfORM: translate(-50%, -50%);             left: 50%;             top: 50%;             color: #ccc;         }         .xj-wrap .xj-pre-img {             width: 100%;             height: 100%;             background-repeat: no-repeat;             background-position: center center;             background-size: 100%;         }         .xj-file {             position: absolute;             left: 0;             right: 0;             bottom: 0;             top: 0;             opacity: 0;             cursor: pointer;         }

js代码:

(function(win, doc){     function xjFile(opt) {         var defaultOption = {             el: doc.body,             accept: '*', // 格式按照'image/jpg,image/gif'传             clsName: 'xj-wrap',             beforeUpload: function(e) { console.log(e) },             onProgress: function(e) { console.log(e) },             onLoad: function(e) { console.log(e) },             onError: function(e) { console.error('文件读取错误', e) }         };          // 获取dom         if(opt.el) {             opt.el = typeof opt.el === 'object' ? opt.el : document.querySelector(opt.el);         }          this.opt = minix(defaultOption, opt);         this.value = '';         this.init();     }      xjFile.prototype.init = function() {         this.render();         this.watch();     }      xjFile.prototype.render = function() {         var fragment = document.createDocumentFragment(),             file = document.createElement('input'),             imgBox = document.createElement('div');         file.type = 'file';         file.accept = this.opt.accept || '*';         file.className = 'xj-file';         imgBox.className = 'xj-pre-img';         // 插入fragment         fragment.appendChild(file);         fragment.appendChild(imgBox);         // 给包裹组件设置class         this.opt.el.className = this.opt.clsName;         this.opt.el.appendChild(fragment);     }      xjFile.prototype.watch = function() {         var ipt = this.opt.el.querySelector('.xj-file');         var _this = this;         ipt.addEventListener('change', (e) => {             var file = ipt.files[0];              // 给组件赋值             _this.value = file;              var fileReader = new FileReader();              // 读取文件开始时触发             fileReader.onloadstart = function(e) {                 if(_this.opt.accept !== '*' && _this.opt.accept.indexOf(file.type.toLowerCase()) === -1) {                     fileReader.abort();                     _this.opt.beforeUpload(file, e);                     console.error('文件格式有误', file.type.toLowerCase());                 }             }              // 读取完成触发的事件             fileReader.onload = (e) => {                 var imgBox = this.opt.el.querySelector('.xj-pre-img');                 if(isImage(file.type)) {                     imgBox.innerhtml = '';                     imgBox.style.backgroundImage = 'url(' + fileReader.result + ')';                 } else {                     imgBox.innerHTML = fileReader.result;                 }                                  imgBox.title = file.name;                  this.opt.onLoad(e);             }              // 文件读取出错事件             fileReader.onerror = (e) => {                 this.opt.onError(e);             }              // 文件读取进度事件             fileReader.onprogress = (e) => {                 this.opt.onProgress(e);             }              isImage(file.type) ? fileReader.readAsDataURL(file) : fileReader.readAsText(file);                      }, false);     }      // 清除ipt和组件的值,支持链式调用     xjFile.prototype.clearFile = function() {         this.opt.el.querySelector('.xj-file').value = '';         this.value = '';         return this     }      // 简单对象混合     function minix(source, target) {         for(var key in target) {             source[key] = target[key];         }         return source     }      // 检测图片类型     function isImage(type) {         var reg = /(image\/jpeg|image\/jpg|image\/gif|image\/png)/gi;         return reg.test(type)     }      // 将方法挂载到window上     win.xjFile = xjFile;  })(window, document);

class版(后期规划)

class版的也很简单,大致框架如下,感兴趣的朋友可以实现一下呦~

class XjFile {     constructor(opt) {      }      init() {      }      watch() {      }      render() {      }      clearFile() {      }      minix(source, target) {              }      isImage(type) {              } }

上述内容就是原生JavaScript如何实现具有进度监听的文件上传预览组件,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网html频道。

--结束END--

本文标题: 原生JavaScript如何实现具有进度监听的文件上传预览组件

本文链接: https://lsjlt.com/news/82225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 原生JavaScript如何实现具有进度监听的文件上传预览组件
    本篇文章为大家展示了原生JavaScript如何实现具有进度监听的文件上传预览组件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。原生js的使用通过面向对象的方式实现...
    99+
    2024-04-02
  • JavaScript如何实现txt文件上传预览功能
    小编给大家分享一下JavaScript如何实现txt文件上传预览功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!今天做项目刚好...
    99+
    2024-04-02
  • 原生javascript如何实现上传图片带进度条
    小编给大家分享一下原生javascript如何实现上传图片带进度条,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascri...
    99+
    2024-04-02
  • H5如何实现手机端多文件上传预览插件
    这篇文章将为大家详细讲解有关H5如何实现手机端多文件上传预览插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基于zepto,支持多文件上传,进度和图片预览,用于手机端。...
    99+
    2024-04-02
  • Ajax如何实现上传文件进度条Codular
    这篇文章主要介绍了Ajax如何实现上传文件进度条Codular,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Let's Code我们...
    99+
    2024-04-02
  • HTML5如何实现上传文件显示进度
    这篇文章主要为大家展示了“HTML5如何实现上传文件显示进度”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5如何实现上传文件显示进度”这篇文章吧。 这...
    99+
    2024-04-02
  • vue如何实现实时上传文件进度条
    这篇文章主要介绍了vue如何实现实时上传文件进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下//上传文件组件<el-upload  ...
    99+
    2023-06-29
  • jquery+ajax的多文件上传进度条如何实现
    这篇文章主要介绍了jquery+ajax的多文件上传进度条如何实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果图前端代码,基于jque...
    99+
    2024-04-02
  • 如何实现react显示文件上传进度demo
    这篇文章给大家分享的是有关如何实现react显示文件上传进度demo的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。在...
    99+
    2023-06-14
  • 使用 Golang 实现文件上传进度条如何实现?
    golang 中实现文件上传进度条需要以下步骤:下载 github.com/gin-gonic/gin 和 github.com/go-bindata/go-bindata 包;导入这些...
    99+
    2024-05-13
    进度条 文件上传 git golang
  • 如何使用file标签实现多图文件上传预览
    这篇文章主要介绍如何使用file标签实现多图文件上传预览,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!js 代码:<script>   //下面用于多...
    99+
    2024-04-02
  • JQ图片文件上传之如何实现前预览功能
    小编给大家分享一下JQ图片文件上传之如何实现前预览功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、先准备一个divonchange触发事件<input type=&q...
    99+
    2024-04-02
  • 如何实现fileUpload文件上传带进度条效果
    这篇文章将为大家详细讲解有关如何实现fileUpload文件上传带进度条效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图:服务器端servlet:public&n...
    99+
    2024-04-02
  • Spring boot+LayIM + t-io如何实现文件上传和监听用户状态
    小编给大家分享一下Spring boot+LayIM + t-io如何实现文件上传和监听用户状态,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!springboot...
    99+
    2023-05-30
    springboot layim
  • 如何使用Html5实现异步上传文件,支持跨域,带有上传进度条
    这篇文章主要为大家展示了“如何使用Html5实现异步上传文件,支持跨域,带有上传进度条”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用Html5实现异步上...
    99+
    2024-04-02
  • 原生ajax和iframe框架如何实现图片文件上传
    这篇文章主要为大家展示了“原生ajax和iframe框架如何实现图片文件上传”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“原生ajax和iframe框架如何实现...
    99+
    2024-04-02
  • jquery-file-upload如何实现文件上传带进度条效果
    这篇文章主要为大家展示了“jquery-file-upload如何实现文件上传带进度条效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery-file-...
    99+
    2024-04-02
  • HTML5中Ajax如何实现文件上传并显示进度条
    这篇文章主要介绍HTML5中Ajax如何实现文件上传并显示进度条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下效果图:html5上传是同步上传的方式,所以能够实现进度条的显示。1.上传文件:首先我们用aj...
    99+
    2023-06-08
  • BootStrap Fileinput插件和Bootstrap table表格插件如何实现文件上传、预览、提交等功能
    这篇文章主要为大家展示了“BootStrap Fileinput插件和Bootstrap table表格插件如何实现文件上传、预览、提交等功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作