最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你3分鐘利用原生js實(shí)現(xiàn)有進(jìn)度監(jiān)聽的文件上傳預(yù)覽組件

 更新時(shí)間:2019年07月08日 09:10:19   作者:徐小夕  
這篇文章主要給大家介紹了關(guān)于如何3分鐘利用原生js實(shí)現(xiàn)有進(jìn)度監(jiān)聽的文件上傳預(yù)覽組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

涉及的核心知識點(diǎn)如下:

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

github地址

用原生js實(shí)現(xiàn)具有進(jìn)度監(jiān)聽的文件上傳預(yù)覽組件 (本地下載

Demo演示

使用:

<div id="test"></div>
<script src="./js/xjFile.js"></script>
<script>
 new xjFile({
  el: '#test', // 不填則直接默認(rèn)掛在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('文件讀取錯(cuò)誤', 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('文件讀取錯(cuò)誤', 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);
  // 給包裹組件設(shè)置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();

   // 讀取文件開始時(shí)觸發(fā)
   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());
    }
   }

   // 讀取完成觸發(fā)的事件
   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);
   }

   // 文件讀取出錯(cuò)事件
   fileReader.onerror = (e) => {
    this.opt.onError(e);
   }

   // 文件讀取進(jìn)度事件
   fileReader.onprogress = (e) => {
    this.opt.onProgress(e);
   }

   isImage(file.type) ? fileReader.readAsDataURL(file) : fileReader.readAsText(file);
   
  }, false);
 }

 // 清除ipt和組件的值,支持鏈?zhǔn)秸{(diào)用
 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版(后期規(guī)劃)

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

class XjFile {
 constructor(opt) {

 }

 init() {

 }

 watch() {

 }

 render() {

 }

 clearFile() {

 }

 minix(source, target) {
  
 }

 isImage(type) {
  
 }
}

總結(jié)

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

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • js圖片跟隨鼠標(biāo)移動(dòng)代碼

    js圖片跟隨鼠標(biāo)移動(dòng)代碼

    大家瀏覽網(wǎng)頁的時(shí)候,見到過圖片跟隨鼠標(biāo)移動(dòng)的js特效,效果非常好,是怎么實(shí)現(xiàn)的呢,實(shí)現(xiàn)這個(gè)功能很簡單,感興趣的朋友一起看看吧
    2015-11-11
  • json中換行符的處理方法示例介紹

    json中換行符的處理方法示例介紹

    json經(jīng)常使用,但如果字段中出現(xiàn)換行符如何處理,測試一下json類的處理,也沒有發(fā)現(xiàn)。想不到最終的處理確實(shí)如此簡單
    2014-06-06
  • 簡單實(shí)現(xiàn)JS對dom操作封裝

    簡單實(shí)現(xiàn)JS對dom操作封裝

    這篇文章主要介紹了簡單實(shí)現(xiàn)JS對dom操作封裝,需要的朋友可以參考下
    2015-12-12
  • 你可能從未使用過的11+個(gè)JavaScript特性(小結(jié))

    你可能從未使用過的11+個(gè)JavaScript特性(小結(jié))

    這篇文章主要介紹了你可能從未使用過的11+個(gè)JavaScript特性(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • JavaScript 私有成員分析

    JavaScript 私有成員分析

    JavaScript是世界上最受誤解的語言。有人認(rèn)為它缺少信息隱藏的屬性(封裝),因?yàn)镴avaScript對象不能擁有私有變量和函數(shù)。但這是誤解。JavaScript對象可以有私有成員。下面進(jìn)行說明。
    2009-01-01
  • js實(shí)現(xiàn)的早期滑動(dòng)門菜單效果代碼

    js實(shí)現(xiàn)的早期滑動(dòng)門菜單效果代碼

    這篇文章主要介紹了js實(shí)現(xiàn)的早期滑動(dòng)門菜單效果代碼,涉及javascript數(shù)組遍歷及通過鼠標(biāo)事件動(dòng)態(tài)改變頁面元素屬性的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • JavaScript 模擬類機(jī)制及私有變量的方法及思路

    JavaScript 模擬類機(jī)制及私有變量的方法及思路

    這篇文章介紹了JavaScript模擬類機(jī)制及私有變量的方法及思路,有需要的朋友可以參考一下
    2013-07-07
  • firefox下input type="file"的size是多大

    firefox下input type="file"的size是多大

    firefox對type="file" 的input的width定義目前是不支持的,但是FF支持size屬性,可以給size設(shè)置一個(gè)值,來控制上傳框的大小
    2011-10-10
  • JavaScript箭頭函數(shù)中的this詳解

    JavaScript箭頭函數(shù)中的this詳解

    這篇文章主要介紹了JavaScript箭頭函數(shù)中的this詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • JS實(shí)現(xiàn)"上次操作未完成禁止新操作"邏輯特事特辦方案

    JS實(shí)現(xiàn)"上次操作未完成禁止新操作"邏輯特事特辦方案

    這篇文章主要介紹了詳解JS如何實(shí)現(xiàn)"上次操作未完成禁止新操作"的邏輯及思路,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評論

南雄市| 怀仁县| 荥阳市| 洛宁县| 儋州市| 天峨县| 新宁县| 荣成市| 民勤县| 普兰县| 晴隆县| 襄垣县| 新邵县| 彭山县| 柏乡县| 南昌县| 曲周县| 长泰县| 大姚县| 平潭县| 南城县| 曲靖市| 旬阳县| 故城县| 庆安县| 阿荣旗| 吴桥县| 英吉沙县| 衡水市| 稷山县| 辽阳市| 阳原县| 望奎县| 佛学| 科技| 南投县| 包头市| 沅江市| 鄂托克前旗| 芦山县| 和龙市|