jQuery實現(xiàn)input[type=file]多圖預(yù)覽上傳刪除等功能
下面我們了解一下,多圖上傳時,怎么實現(xiàn)預(yù)覽、上傳、刪除等功能。下圖是功能實現(xiàn)的預(yù)覽效果,雖然樣式有點丑,不過功能還是實現(xiàn)了。話不多說,直接看代碼會更直觀一些。
首先定義一下基本格式,樣式代碼自行腦補:
<body> <div class="upload-header"> <input id="upload" type="file" accept="image/*" multiple="multiple"> <button class="btn">點擊上傳</button> </div> <div class="img-box"> <!-- 存放預(yù)覽圖片 --> </div> </body>
接著定義看一下具體的js實現(xiàn)代碼,我是基于JQ做的開發(fā),方便DOM的操作。
1. 預(yù)覽功能的實現(xiàn)
這里監(jiān)聽input[type=file]
的change事件,在回調(diào)函數(shù)中,取到暫存區(qū)的文件e.target.files
,通過遍歷files 文件屬性,使用FileReader 函數(shù)讀取文件的值,然后使用append方法把圖片放入指定盒子中。備注::FileReader是一種異步文件讀取機制,結(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方法對預(yù)覽的圖片添加點擊事件,這里使用on方法主要是因為on方法對后面添加的dom可以繼續(xù)監(jiān)聽。當(dāng)需要刪除照片時,直接刪除其圖片的父節(jié)點及以下節(jié)點就可以了。此時記得把暫存區(qū)的文件filesList也要對應(yīng)刪除。
delImage: function () { var that = this; $('.img-box').on('click', '.del-img', function () { var delStatus = confirm('確認這張圖片刪除嗎?'); if (delStatus) { var index = $(this).parent().index(); $(this).parent().remove(); that.filesList.splice(index, 1); console.log('我刪除啦', index); }; }); }
2. 圖片批量上傳功能
圖片上傳我定義了兩個方法,第一方法是點擊上傳后,對所有文件進行遍歷,依次調(diào)取上傳的方法(因為用的七牛上傳工具,只支持單個文件上傳,所以采取了遍歷的方式)。第二個方法使用了jq的ajax的post上傳方式,使用FormData實例,添加file屬性進行上傳。因為是批量上傳,所以我使用了定義臨時變量flag 的方式來判斷文件是否都上傳完成,當(dāng)flag的值與filesList的數(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。因為是FormData對象,且已經(jīng)聲明了屬性enctype="multipart/form-data" processData: false, //需設(shè)置為false。因為data值是FormData對象,不需要對數(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: [], // 點擊上傳 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。因為是FormData對象,且已經(jīng)聲明了屬性enctype="multipart/form-data" processData: false, //需設(shè)置為false。因為data值是FormData對象,不需要對數(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('確認這張圖片刪除嗎?'); if (delStatus) { var index = $(this).parent().index(); $(this).parent().remove(); that.filesList.splice(index, 1); console.log('我刪除啦', index); }; }); } } var UploadFunction = new UploadFunction('小明刪照片');
總結(jié)
以上所述是小編給大家介紹的jQuery實現(xiàn)input[type=file]多圖預(yù)覽上傳刪除等功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
基于jQuery中ajax的相關(guān)方法匯總(必看篇)
下面小編就為大家?guī)硪黄诨趈Query中ajax的相關(guān)方法匯總。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11使用Jquery獲取Thymeleaf參數(shù)的三種方式小結(jié)
在使用Thymeleaf進行數(shù)據(jù)填充的時候,發(fā)現(xiàn)使用jquery原始方式獲取內(nèi)容參數(shù)發(fā)現(xiàn)拿不到數(shù)據(jù),本文主要介紹了使用Jquery獲取Thymeleaf參數(shù)的三種方式小結(jié),感興趣的可以了解一下2024-07-07jQuery動態(tài)生成不規(guī)則表格(前后端)
這篇文章主要介紹了jQuery動態(tài)生成不規(guī)則表格的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-02-02jQuery實現(xiàn)鼠標(biāo)選中文字后彈出提示窗口效果【附demo源碼】
這篇文章主要介紹了jQuery實現(xiàn)鼠標(biāo)選中文字后彈出提示窗口效果,涉及jQuery事件響應(yīng)及頁面元素動態(tài)操作相關(guān)技巧,非常簡便實用,需要的朋友可以參考下2016-09-09JQuery 1.6發(fā)布 性能提升,同時包含大量破壞性變更
JQuery 1.6剛剛發(fā)布了,有幾處性能和跨瀏覽器兼容性的改進,專門重寫了屬性模塊2011-05-05