溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jQuery實(shí)現(xiàn)input[type=file]多圖預(yù)覽上傳刪除等功能

發(fā)布時(shí)間:2020-10-15 09:20:36 來(lái)源:腳本之家 閱讀:208 作者:lander_xiong 欄目:web開發(fā)

下面我們了解一下,多圖上傳時(shí),怎么實(shí)現(xiàn)預(yù)覽、上傳、刪除等功能。下圖是功能實(shí)現(xiàn)的預(yù)覽效果,雖然樣式有點(diǎn)丑,不過(guò)功能還是實(shí)現(xiàn)了。話不多說(shuō),直接看代碼會(huì)更直觀一些。

jQuery實(shí)現(xiàn)input[type=file]多圖預(yù)覽上傳刪除等功能

首先定義一下基本格式,樣式代碼自行腦補(bǔ):

<body>
 <div class="upload-header">
 <input id="upload" type="file" accept="image/*" multiple="multiple">
 <button class="btn">點(diǎn)擊上傳</button>
 </div>
 <div class="img-box">
 <!-- 存放預(yù)覽圖片 -->
 </div>
</body>

接著定義看一下具體的js實(shí)現(xiàn)代碼,我是基于JQ做的開發(fā),方便DOM的操作。

1. 預(yù)覽功能的實(shí)現(xiàn)

這里監(jiān)聽input[type=file]的change事件,在回調(diào)函數(shù)中,取到暫存區(qū)的文件e.target.files,通過(guò)遍歷files 文件屬性,使用FileReader 函數(shù)讀取文件的值,然后使用append方法把圖片放入指定盒子中。備注::FileReader是一種異步文件讀取機(jī)制,結(jié)合input:file可以很方便的讀取本地文件。

imgPreview: function () {
 var that = this;
 $('.upload-header').on('change', '#upload', function(e) {
  var files = e.target.files;
  if (files.length > 0) {
  for (var i = 0; i < files.length; i++) {
   var reader = new FileReader();
   reader.onload = function () {
   var text = `
    <div class="img-list">
    <img src="${this.result}" alt="">
    <div class="del-img">刪除</div>
    </div>
   `
   $('.img-box').append(text);
   };
   reader.readAsDataURL(files[i]);
   that.filesList.push(files[i]);
  };
  };
 })
 }

2. 圖片刪除功能

這里是使用on方法對(duì)預(yù)覽的圖片添加點(diǎn)擊事件,這里使用on方法主要是因?yàn)閛n方法對(duì)后面添加的dom可以繼續(xù)監(jiān)聽。當(dāng)需要?jiǎng)h除照片時(shí),直接刪除其圖片的父節(jié)點(diǎn)及以下節(jié)點(diǎn)就可以了。此時(shí)記得把暫存區(qū)的文件filesList也要對(duì)應(yīng)刪除。

delImage: function () {
 var that = this;
 $('.img-box').on('click', '.del-img', function () {
  var delStatus = confirm('確認(rèn)這張圖片刪除嗎?');
  if (delStatus) {
  var index = $(this).parent().index();
  $(this).parent().remove();
  that.filesList.splice(index, 1);
  console.log('我刪除啦', index);
  };
 });
 }

2. 圖片批量上傳功能

圖片上傳我定義了兩個(gè)方法,第一方法是點(diǎn)擊上傳后,對(duì)所有文件進(jìn)行遍歷,依次調(diào)取上傳的方法(因?yàn)橛玫钠吲I蟼鞴ぞ?,只支持單個(gè)文件上傳,所以采取了遍歷的方式)。第二個(gè)方法使用了jq的ajax的post上傳方式,使用FormData實(shí)例,添加file屬性進(jìn)行上傳。因?yàn)槭桥可蟼?,所以我使用了定義臨時(shí)變量flag 的方式來(lái)判斷文件是否都上傳完成,當(dāng)flag的值與filesList的數(shù)量一致時(shí),就可以判斷所有上傳完成。使用方法比較low,如果其他好的方法可以留言交流。

clickUpload: function () {
 var that = this;
 var filesList = this.filesList;
 $('.btn').on('click', function() {
 that.flag = 0;
 if (filesList.length > 0) {
  for (var i = 0; i < filesList.length; i++) {
  that.upLoadMethod(filesList[i]);
  }
 };
 }) 
},
upLoadMethod: function (file) {
 var that = this;
 var formData = new FormData();
 formData.append('file', file);
 $.ajax({
  type: "post",
  url: 'http://172.16.1.99:8703/file/upload',
  data: formData,
  mimeType: "multipart/form-data",
  dataType: "json",
  async: false,
  cache: false, //上傳文件不需要緩存
  contentType: false, //需設(shè)置為false。因?yàn)槭荈ormData對(duì)象,且已經(jīng)聲明了屬性enctype="multipart/form-data"
  processData: false, //需設(shè)置為false。因?yàn)閐ata值是FormData對(duì)象,不需要對(duì)數(shù)據(jù)做處理
  success: function (response) {
  that.flag += 1;
  if (that.flag === that.filesList.length) {
   console.log('我上傳完成了');
  };
  },
  error: function (err) {
  console.log('上傳失敗');
  }
 });
 },

以下是完整的js代碼,供參考:

<script>
 function UploadFunction (name) {
 this.name = name;
 this.init();
 };
 UploadFunction.prototype = {
 // 初始化
 init: function () {
  this.clickUpload();
  this.imgPreview();
  this.delImage();
 },
 flag: 0,
 filesList: [],
 // 點(diǎn)擊上傳
 clickUpload: function () {
  var that = this;
  var filesList = this.filesList;
  $('.btn').on('click', function() {
  that.flag = 0;
  if (filesList.length > 0) {
   for (var i = 0; i < filesList.length; i++) {
   that.upLoadMethod(filesList[i]);
   }
  };
  }) 
 },
 imgPreview: function () {
  var that = this;
  $('.upload-header').on('change', '#upload', function(e) {
  var files = e.target.files;
  console.log(files);
  if (files.length > 0) {
   for (var i = 0; i < files.length; i++) {
   var reader = new FileReader();
   reader.onload = function () {
    var text = `
    <div class="img-list">
     <img src="${this.result}" alt="">
     <div class="del-img">刪除</div>
    </div>
    `
    $('.img-box').append(text);
   };
   reader.readAsDataURL(files[i]);
   that.filesList.push(files[i]);
   };
  };
  })
 },
 upLoadMethod: function (file) {
  var that = this;
  var formData = new FormData();
  formData.append('file', file);
  $.ajax({
  type: "post",
  url: '這里使用上傳的地址/upload',
  data: formData,
  mimeType: "multipart/form-data",
  dataType: "json",
  async: false,
  cache: false, //上傳文件不需要緩存
  contentType: false, //需設(shè)置為false。因?yàn)槭荈ormData對(duì)象,且已經(jīng)聲明了屬性enctype="multipart/form-data"
  processData: false, //需設(shè)置為false。因?yàn)閐ata值是FormData對(duì)象,不需要對(duì)數(shù)據(jù)做處理
  success: function (response) {
   that.flag += 1;
   if (that.flag === that.filesList.length) {
   console.log('我上傳完成了');
   };
  },
  error: function (err) {
   console.log('上傳失敗');
  }
  });
 },
 delImage: function () {
  var that = this;
  $('.img-box').on('click', '.del-img', function () {
  var delStatus = confirm('確認(rèn)這張圖片刪除嗎?');
  if (delStatus) {
   var index = $(this).parent().index();
   $(this).parent().remove();
   that.filesList.splice(index, 1);
   console.log('我刪除啦', index);
  };
  });
 }
 }
 var UploadFunction = new UploadFunction('小明刪照片');

總結(jié)

以上所述是小編給大家介紹的jQuery實(shí)現(xiàn)input[type=file]多圖預(yù)覽上傳刪除等功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI