精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端進階:原生JavaScript實現(xiàn)具有進度監(jiān)聽的文件上傳預(yù)覽組件

開發(fā) 前端
本文主要介紹如何使用原生js,通過面向?qū)ο蟮姆绞綄崿F(xiàn)一個文件上傳預(yù)覽的組件,該組件利用FileReader來實現(xiàn)文件在前端的解析,預(yù)覽,讀取進度等功能,并對外暴露相應(yīng)api來實現(xiàn)用戶自定義的需求,比如文件上傳,進度監(jiān)聽,自定義樣式,讀取成功回調(diào)等。

[[385115]]

本文主要介紹如何使用原生js,通過面向?qū)ο蟮姆绞綄崿F(xiàn)一個文件上傳預(yù)覽的組件,該組件利用FileReader來實現(xiàn)文件在前端的解析,預(yù)覽,讀取進度等功能,并對外暴露相應(yīng)api來實現(xiàn)用戶自定義的需求,比如文件上傳,進度監(jiān)聽,自定義樣式,讀取成功回調(diào)等。

組件設(shè)計架構(gòu)如下:

涉及的核心知識點如下:

  1. 閉包:減少變量污染,縮短變量查找范圍
  2. 自執(zhí)行函數(shù)
  3. file API:對文件進行讀取,解析,監(jiān)控文件事件
  4. DocumentFragment API:主要用來優(yōu)化dom操作
  5. minix :用來實現(xiàn)對象混合
  6. 正則表達式:匹配文件類型
  7. class :類組件

github地址

用原生js實現(xiàn)具有進度監(jiān)聽的文件上傳預(yù)覽組件

Demo演示


使用:

  1. <div id="test"></div> 
  2. <script src="./js/xjFile.js"></script> 
  3. <script> 
  4.     new xjFile({ 
  5.         el: '#test', // 不填則直接默認(rèn)掛在body上 
  6.         accept: 'image/png', // 可選 
  7.         clsName: 'xj-wrap', // 可選 
  8.         beforeUpload: function(e) { console.log(e) }, // 可選 
  9.         onProgress: function(e) { console.log(e) }, // 可選 
  10.         onLoad: function(e) { console.log(e) }, // 可選 
  11.         onError: function(e) { console.error('文件讀取錯誤', e) } // 可選 
  12.     }); 
  13. </script> 

css代碼:

  1. .xj-wrap { 
  2.             position: relative
  3.             display: inline-block; 
  4.             border: 1px dashed #888; 
  5.             width: 200px; 
  6.             height: 200px; 
  7.             border-radius: 6px; 
  8.             overflow: hidden; 
  9.         } 
  10.         .xj-wrap::before { 
  11.             content: '+'
  12.             font-size: 36px; 
  13.             position: absolute
  14.             transform: translate(-50%, -50%); 
  15.             left: 50%; 
  16.             top: 50%; 
  17.             color: #ccc; 
  18.         } 
  19.         .xj-wrap .xj-pre-img { 
  20.             width: 100%; 
  21.             height: 100%; 
  22.             background-repeat: no-repeat; 
  23.             background-position: center center; 
  24.             background-size: 100%; 
  25.         } 
  26.         .xj-file { 
  27.             position: absolute
  28.             left: 0; 
  29.             right: 0; 
  30.             bottom: 0; 
  31.             top: 0; 
  32.             opacity: 0; 
  33.             cursor: pointer; 
  34.         } 

js代碼:

  1. (function(win, doc){ 
  2.     function xjFile(opt) { 
  3.         var defaultOption = { 
  4.             el: doc.body, 
  5.             accept: '*', // 格式按照'image/jpg,image/gif'傳 
  6.             clsName: 'xj-wrap'
  7.             beforeUpload: function(e) { console.log(e) }, 
  8.             onProgress: function(e) { console.log(e) }, 
  9.             onLoad: function(e) { console.log(e) }, 
  10.             onError: function(e) { console.error('文件讀取錯誤', e) } 
  11.         }; 
  12.  
  13.         // 獲取dom 
  14.         if(opt.el) { 
  15.             opt.el = typeof opt.el === 'object' ? opt.el : document.querySelector(opt.el); 
  16.         } 
  17.  
  18.         this.opt = minix(defaultOption, opt); 
  19.         this.value = ''
  20.         this.init(); 
  21.     } 
  22.  
  23.     xjFile.prototype.init = function() { 
  24.         this.render(); 
  25.         this.watch(); 
  26.     } 
  27.  
  28.     xjFile.prototype.render = function() { 
  29.         var fragment = document.createDocumentFragment(), 
  30.             file = document.createElement('input'), 
  31.             imgBox = document.createElement('div'); 
  32.         file.type = 'file'
  33.         file.accept = this.opt.accept || '*'
  34.         file.className = 'xj-file'
  35.         imgBox.className = 'xj-pre-img'
  36.         // 插入fragment 
  37.         fragment.appendChild(file); 
  38.         fragment.appendChild(imgBox); 
  39.         // 給包裹組件設(shè)置class 
  40.         this.opt.el.className = this.opt.clsName; 
  41.         this.opt.el.appendChild(fragment); 
  42.     } 
  43.  
  44.     xjFile.prototype.watch = function() { 
  45.         var ipt = this.opt.el.querySelector('.xj-file'); 
  46.         var _this = this; 
  47.         ipt.addEventListener('change', (e) => { 
  48.             var file = ipt.files[0]; 
  49.  
  50.             // 給組件賦值 
  51.             _this.value = file; 
  52.  
  53.             var fileReader = new FileReader(); 
  54.  
  55.             // 讀取文件開始時觸發(fā) 
  56.             fileReader.onloadstart = function(e) { 
  57.                 if(_this.opt.accept !== '*' && _this.opt.accept.indexOf(file.type.toLowerCase()) === -1) { 
  58.                     fileReader.abort(); 
  59.                     _this.opt.beforeUpload(file, e); 
  60.                     console.error('文件格式有誤', file.type.toLowerCase()); 
  61.                 } 
  62.             } 
  63.  
  64.             // 讀取完成觸發(fā)的事件 
  65.             fileReader.onload = (e) => { 
  66.                 var imgBox = this.opt.el.querySelector('.xj-pre-img'); 
  67.                 if(isImage(file.type)) { 
  68.                     imgBox.innerHTML = ''
  69.                     imgBox.style.backgroundImage = 'url(' + fileReader.result + ')'
  70.                 } else { 
  71.                     imgBox.innerHTML = fileReader.result; 
  72.                 } 
  73.                  
  74.                 imgBox.title = file.name
  75.  
  76.                 this.opt.onLoad(e); 
  77.             } 
  78.  
  79.             // 文件讀取出錯事件 
  80.             fileReader.onerror = (e) => { 
  81.                 this.opt.onError(e); 
  82.             } 
  83.  
  84.             // 文件讀取進度事件 
  85.             fileReader.onprogress = (e) => { 
  86.                 this.opt.onProgress(e); 
  87.             } 
  88.  
  89.             isImage(file.type) ? fileReader.readAsDataURL(file) : fileReader.readAsText(file); 
  90.              
  91.         }, false); 
  92.     } 
  93.  
  94.     // 清除ipt和組件的值,支持鏈?zhǔn)秸{(diào)用 
  95.     xjFile.prototype.clearFile = function() { 
  96.         this.opt.el.querySelector('.xj-file').value = ''
  97.         this.value = ''
  98.         return this 
  99.     } 
  100.  
  101.     // 簡單對象混合 
  102.     function minix(source, target) { 
  103.         for(var key in target) { 
  104.             source[key] = target[key]; 
  105.         } 
  106.         return source 
  107.     } 
  108.  
  109.     // 檢測圖片類型 
  110.     function isImage(type) { 
  111.         var reg = /(image\/jpeg|image\/jpg|image\/gif|image\/png)/gi; 
  112.         return reg.test(type) 
  113.     } 
  114.  
  115.     // 將方法掛載到window上 
  116.     win.xjFile = xjFile; 
  117.  
  118. })(window, document); 

class版(后期規(guī)劃)

class版的也很簡單,大致框架如下,感興趣的朋友可以實現(xiàn)一下呦~

  1. class XjFile { 
  2.     constructor(opt) { 
  3.  
  4.     } 
  5.  
  6.     init() { 
  7.  
  8.     } 
  9.  
  10.     watch() { 
  11.  
  12.     } 
  13.  
  14.     render() { 
  15.  
  16.     } 
  17.  
  18.     clearFile() { 
  19.  
  20.     } 
  21.  
  22.     minix(source, target) { 
  23.          
  24.     } 
  25.  
  26.     isImage(type) { 
  27.          
  28.     } 

總結(jié)

該組件仍有需要完善的地方,在后期使用中,會慢慢更新,優(yōu)化,歡迎大家提出寶貴的建議。

 

責(zé)任編輯:姜華 來源: 趣談前端
相關(guān)推薦

2009-11-24 15:23:50

PHP文件上傳進度條

2009-07-21 14:49:55

XmlHttpRequ文件上傳進度條

2020-04-02 20:07:17

前端vuenote.js

2021-11-29 08:50:57

Javascript存儲函數(shù)

2012-03-27 11:08:23

Java

2020-10-20 11:12:11

Nodejs

2011-12-30 09:49:36

Silverlight

2021-06-01 05:15:36

JavaScript 前端大文件并發(fā)上傳

2020-03-06 10:05:59

前端Javascript代碼

2016-11-09 10:28:36

Nodejs文件上傳express+mul

2009-11-16 14:27:45

PHP上傳文件進度

2017-12-01 10:13:42

前端操作上傳

2021-05-07 08:20:52

前端開發(fā)技術(shù)熱點

2009-07-02 13:31:13

JSP組件

2015-05-07 15:13:22

JS實現(xiàn)JQueryJQuery

2025-05-29 01:00:00

文件監(jiān)聽函數(shù)

2021-02-05 08:18:29

JavaScript開發(fā)代碼

2009-07-06 17:11:38

Servlet文件上傳

2009-07-14 17:20:31

Webwork文件上傳

2021-01-04 14:41:28

開發(fā)前端工具
點贊
收藏

51CTO技術(shù)棧公眾號

日本毛片在线观看| 少妇激情综合网| 韩日欧美一区二区| 久久久久久香蕉| 性猛交xxxx乱大交孕妇印度| 精品久久视频| 99久久久久免费精品国产 | 国产精品2区| 91污片在线观看| 欧美老女人性视频| 亚洲色图久久久| 天堂中文字幕在线| 国产精一区二区| 亚洲v中文字幕| 亚洲自拍偷拍区| 黄色av免费播放| 国模冰冰炮一区二区| 成人久久18免费网站麻豆| 不卡毛片在线看| 一个色综合久久| 成人激情电影在线看| 日韩一级在线| 亚洲第一福利网| 人妻av无码专区| 国产偷拍一区二区| 五月开心六月丁香综合色啪| 欧美专区在线观看一区| 久久爱av电影| 成人在线免费看视频| 风间由美一区二区av101| 亚洲欧美激情一区二区| 亚洲精品国产精品国自产网站| 蜜臀av免费在线观看| 日本不卡免费在线视频| 精品亚洲男同gayvideo网站 | 亚洲欧美偷拍另类| 免费成人在线电影| 成人av资源在线观看| 韩国福利视频一区| 久久免费看少妇高潮v片特黄| 亚洲一区导航| 亚洲精品日产精品乱码不卡| 五月天色一区| 在线观看中文字幕码| 99久久婷婷| 国产一区二区三区毛片| 五月婷婷六月丁香激情| 麻豆视频在线播放| 韩国毛片一区二区三区| 久久亚洲成人精品| 战狼4完整免费观看在线播放版| 88xx成人网| 亚洲欧洲在线观看av| 7777精品伊久久久大香线蕉语言| 国产大片aaa| 你懂的一区二区三区| 欧美中文字幕亚洲一区二区va在线| 欧美日韩黄色一级片| 日本天堂影院在线视频| 日本欧美一区二区三区乱码| 欧美在线视频在线播放完整版免费观看 | 亚洲色图 激情小说| 亚洲老女人视频免费| 日本高清成人免费播放| 97超碰免费观看| 高h震动喷水双性1v1| 玖玖精品视频| 裸体女人亚洲精品一区| 亚洲二区在线播放| 精品视频自拍| 欧美精品自拍偷拍| 国产精品沙发午睡系列| 黄色av网站在线播放| av日韩在线网站| 国产精品三区在线| 亚洲精品久久久久久久蜜桃| 亚洲中无吗在线| 亚洲精选一区二区| 女同性αv亚洲女同志| 欧美日韩123区| 亚洲另类中文字| 美女黄色片网站| 在线观看a级片| 欧美激情综合在线| 成人综合av网| 无码人妻丰满熟妇精品| 激情综合电影网| 中文字幕日韩欧美在线视频| 久久福利小视频| 成人国产在线| 色综合网站在线| 亚洲色成人www永久在线观看| 国产三区四区在线观看| 99久久精品久久久久久清纯| 亚洲综合在线中文字幕| 丰满人妻一区二区三区无码av| 99久久99久久精品免费观看| 日韩免费av电影| 色婷婷av一区二区三区之红樱桃| 精品在线播放免费| 国产高清在线不卡| 国产成人自拍视频在线| 亚洲欧美一级二级三级| 日韩专区在线播放| x88av在线| 中文字幕一区二区三区乱码图片| 91av视频导航| 男女啊啊啊视频| 亚洲国产精品一区| 欧美激情小视频| 中文字幕手机在线观看| 伊人久久大香线蕉综合四虎小说| 午夜精品在线观看| 一级全黄裸体免费视频| 麻豆成人av在线| 国产在线观看精品| 欧美福利一区| 成人三级伦理片| 蜜桃久久精品乱码一区二区| 六月丁香激情综合| 免费在线观看日韩欧美| 日韩av免费看| 亚洲黄网在线观看| 国产麻豆欧美日韩一区| 成人av色在线观看| 国产视频在线观看视频| 久久精品一二三| 日本一区二区在线视频观看| av资源网在线观看| 午夜电影网一区| 在线观看网站黄| 日韩精品一级| 欧美www视频| 国产吃瓜黑料一区二区| 久久资源中文字幕| 久久久国产视频91| 欧美日韩国产精品一区二区三区| 欧美大片一区| 91精品国产综合久久久久久蜜臀 | 蜜乳av一区二区| 久久国产精品免费一区| heyzo中文字幕在线| 精品电影在线观看| 欧美极品欧美精品欧美图片| 日韩视频网站在线观看| 欧美日韩一卡二卡三卡| 91欧美一区二区三区| 91精品国产自产在线丝袜啪| 日韩成人免费视频| 亚洲熟妇一区二区三区| 不卡中文一二三区| 超碰日本道色综合久久综合| 中文字幕人妻色偷偷久久| 国产真实精品久久二三区| 国产精品国模大尺度私拍| 国产原创在线观看| 91精品国产综合久久精品麻豆| gogo亚洲国模私拍人体| 136福利精品导航| 另类色图亚洲色图| 精品国产无码一区二区| 一区二区三区成人| 国产极品尤物在线| 成人福利片在线| 中文字幕日韩欧美| 国产模特av私拍大尺度| 亚洲精选免费视频| 国产亚洲精品成人a| 欧美手机视频| 国产精品网址在线| 亚洲欧美色视频| 亚洲三级电影全部在线观看高清| 欧美大片在线播放| 日韩精品欧美大片| 久久成年人视频| 成人av免费播放| 天天影视涩香欲综合网| 97超碰在线免费观看| 免费在线看成人av| 成人小视频在线观看免费| 狼人精品一区二区三区在线| 日韩av男人的天堂| 欧美成人精品一区二区男人看| 91精品国产aⅴ一区二区| 欧美成人片在线观看| 99精品久久免费看蜜臀剧情介绍| 蜜臀av午夜一区二区三区| 日韩情爱电影在线观看| 欧美一乱一性一交一视频| www.亚洲天堂.com| 欧美日韩中文字幕在线| 无码人妻精品一区二区三区99不卡| 日韩三级在线| 国产 高清 精品 在线 a| 中文字幕乱码中文乱码51精品| 欧美成人一区二区三区| 91免费在线看片| 久久蜜桃精品| 成年人黄色在线观看| 日韩一级在线播放| 国产精品欧美综合在线| 亚洲性生活视频| 特级西西444www高清大视频| 波多野结衣中文字幕一区| 黑鬼大战白妞高潮喷白浆| 亚洲乱码精品| 久久亚洲综合网| 少妇真人直播免费视频| 成人直播大秀| 99国产超薄丝袜足j在线观看| 欧美三级黄网| 亚洲黄在线观看| 免费在线黄色片| 国产日韩高清在线| 国产视频在线视频| 欧美精品一区二区三区中文字幕| 亚洲综合中文字幕在线观看| 99精品在免费线偷拍| 91av福利视频| 国产乱码在线| 欧美精品一区二区高清在线观看| 九九视频在线观看| 国产精品色噜噜| 亚洲午夜福利在线观看| 99久精品国产| 亚洲午夜精品在线观看| 日本女优在线视频一区二区| 成人在线免费观看av| 亚洲成色精品| 欧美激情亚洲天堂| 欧美伊人影院| 中文字幕不卡每日更新1区2区| 国产精品久久久久久久久久辛辛| 日本精品视频在线| 欧美男人天堂| 97精品久久久| av影片在线| 高清亚洲成在人网站天堂| 日av在线播放| 日韩精品在线观看视频| 欧美一区二区三区激情| 欧美成人猛片aaaaaaa| 国产视频一区二区三区四区五区| 欧美夫妻性生活| 97超碰国产在线| 67194成人在线观看| 国产精品99无码一区二区| 一区二区三区成人| 久久久久久久久久99| 久久午夜色播影院免费高清| 中文字幕国内自拍| 欧美激情中文字幕乱码免费| 亚洲精品成人区在线观看| 亚洲欧美日韩精品久久久久| 美国黑人一级大黄| 日本一区二区三区视频视频| 国产精久久一区二区三区| 六月丁香婷婷色狠狠久久| 男女污污的视频| 青娱乐精品在线视频| 一级做a免费视频| 九九视频精品免费| 欧美性猛交xx| 成人av网站免费观看| 国产一级二级在线观看| 久久精品国产99| 91视频这里只有精品| 国产精品77777竹菊影视小说| 成人小视频在线看| 日本vs亚洲vs韩国一区三区| 色www免费视频| 国产精品一品二品| 国产精品扒开腿做爽爽爽a片唱戏| jiyouzz国产精品久久| 欧美熟妇一区二区| 国产精品欧美久久久久一区二区| 午夜三级在线观看| 2021中文字幕一区亚洲| 人妻精品久久久久中文字幕| 日本一区二区三区免费乱视频| 黄视频网站免费看| 天天影视涩香欲综合网| 中文在线观看免费高清| 欧美一级一区二区| 天堂中文在线资| 日韩中文在线中文网三级| 色呦呦在线免费观看| 日韩最新在线视频| 羞羞电影在线观看www| 欧美在线播放视频| 91麻豆精品| 快播亚洲色图| 中文字幕一区二区av| 久久久久免费精品| 成人综合在线视频| av永久免费观看| 午夜精品久久久久久久| 在线免费一级片| 日韩精品小视频| 在线免费av导航| 国产精品第10页| 快播电影网址老女人久久| 亚洲a区在线视频| 国产区精品区| 奇米视频888战线精品播放| 欧美国产高清| 国产一二三四在线视频| eeuss影院一区二区三区| 久久福利免费视频| 色婷婷av一区二区三区大白胸| 国产日产亚洲系列最新| 亚洲免费成人av电影| 青春草视频在线观看| 欧美激情一区二区三区在线视频观看 | 一本—道久久a久久精品蜜桃| 夜夜嗨网站十八久久| 一区二区三区四区毛片| 精品一区二区影视| 国产精品亚洲无码| 亚洲影院久久精品| 黄色小说在线观看视频| 在线播放中文字幕一区| 久久精品国产亚洲a∨麻豆| 亚洲精品视频在线观看视频| 色av手机在线| 亚洲一区二区三| 日韩在线中文| 日本在线观看免费视频| 久久久精品国产免费观看同学| 久久狠狠高潮亚洲精品| 精品乱码亚洲一区二区不卡| 超碰人人在线| 性色av一区二区三区在线观看| 欧美欧美在线| 久久久久无码国产精品一区| 国产一区二区三区四区三区四 | 美女尤物久久精品| 妺妺窝人体色www在线观看| aaa欧美色吧激情视频| 久久久久久久久久久久久久免费看 | 中文字字幕在线观看| 亚洲欧美制服丝袜| 日韩欧美小视频| 欧美高清视频一区二区| 免费成人在线电影| 国产在线欧美日韩| 成人精品久久| 特级丰满少妇一级| 国产精品三级视频| 在线视频 中文字幕| 久久精品欧美视频| 国产在线视频欧美一区| 9色视频在线观看| 另类av一区二区| 一本色道综合久久欧美日韩精品| 天天影视涩香欲综合网 | 精品久久久999| а天堂中文最新一区二区三区| 懂色av一区二区三区四区五区| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲网址在线| 国产在线不卡av| 一本色道亚洲精品aⅴ| а√天堂中文在线资源bt在线| 国产精品一区二区女厕厕| 91亚洲国产成人久久精品| 一本之道在线视频| 无码av中文一区二区三区桃花岛| 天堂中文字幕在线| 国产精选久久久久久| 欧美日韩亚洲国产精品| 成人三级视频在线播放| 国产精品美女一区二区在线观看| 国产免费的av| 高清欧美性猛交xxxx| 国产麻豆精品久久| 深夜福利网站在线观看| 精品久久中文字幕| 在线播放毛片| 国产福利久久| 奇米影视一区二区三区小说| 538精品在线视频| 亚洲级视频在线观看免费1级| 日韩一区二区三区在线免费观看| 天天干天天操天天干天天操| 不卡一区二区中文字幕| 欧美人一级淫片a免费播放| 久久精品国产久精国产思思| 国产精品乱战久久久| 丰满少妇在线观看| 亚洲一区二区三区在线看 | 久久婷婷国产麻豆91天堂| 久草在线综合| 污污的视频免费| 精品日本高清在线播放| 丰满人妻一区二区三区四区53| 国产精品第七十二页| 伊人久久婷婷| 天天操天天摸天天舔| 亚洲激情视频在线观看|