js實(shí)現(xiàn)前端圖片上傳即時(shí)預(yù)覽功能
現(xiàn)在,在實(shí)現(xiàn)前端圖片即時(shí)預(yù)覽,可以說是一件很簡(jiǎn)單的事情了。
我們只需要用file對(duì)象和FileReader對(duì)象,既可以輕松實(shí)現(xiàn),無需下載類庫(kù)。
HTML代碼
<!DOCTYPE html> <html> <body> <img src=""> <form> <input type="file" name="image" /> </form> </body> </html>
先來說說input,input這個(gè)元素,具有一個(gè)files屬性,該屬性是一個(gè)filelist對(duì)象,是file對(duì)象的集合。
你可以通過input.files[0]的語(yǔ)法形式拿到這個(gè)file對(duì)象,不過遺憾的是,這個(gè)對(duì)象僅僅包含了用戶選擇的文件的相關(guān)信息,如文件名,大小,類型,最后修改時(shí)間等,并不直接提供文件的數(shù)據(jù)。
程序員只能通過這些信息對(duì)用戶選擇的文件進(jìn)行一些限制。
所以,我們要使用另一個(gè)對(duì)象FileReader來讀取到用戶選擇的文件的數(shù)據(jù)
我們初始化一個(gè)FileReader對(duì)象
var x=new FileReader;
這是一個(gè)初始化完成的FileReader對(duì)象具有的一些屬性和支持的事件
類似于Ajax,F(xiàn)ileReader提供了readyState來查看讀取的狀態(tài),不過并沒有什么卵用
因?yàn)镕ileReader還提供了onloadend這樣的事件,來處理數(shù)據(jù)讀取完成后該干些什么,onprogress是最有趣的,只要在讀取數(shù)據(jù),那么這個(gè)事件會(huì)被不停的觸發(fā),可以實(shí)現(xiàn)那種進(jìn)度條效果。
還有一個(gè)極其重要的屬性result,初始化完成時(shí),該值是null,當(dāng)讀取數(shù)據(jù)后,該值就是所獲得的數(shù)據(jù)。
接下來,我們就可以使用這個(gè)對(duì)象讀取用戶選擇的圖片了,沒有錯(cuò)就是這么簡(jiǎn)單
當(dāng)用戶選擇了某一個(gè)文件時(shí),就會(huì)在input上觸發(fā)change事件,這意味著我們可以開始讀取數(shù)據(jù)了
document.forms[0].elements[0].onchange=function(){ x.readAsDataURL(this.files[0]); }
readASDateURL這個(gè)方法,可以讀取一個(gè)file對(duì)象,并把數(shù)據(jù)以base64的格式填充到FileReader對(duì)象中的result屬性中去。
當(dāng)數(shù)據(jù)讀取完畢,就會(huì)觸發(fā)onloadend事件,在這個(gè)事件中,就可以把數(shù)據(jù)填到img標(biāo)簽中去
x.onloadend=function(){ document.images[0].src=this.result; }
完整版代碼
<!DOCTYPE html> <html> <body> <img src=""> <form> <input type="file" name="image" /> </form> <script type="text/javascript"> var x=new FileReader; document.forms[0].elements[0].onchange=function(){ x.readAsDataURL(this.files[0]); } x.onloadend=function(){ document.images[0].src=this.result; } </script> </body> </html>
當(dāng)然,這里只是一個(gè)小小的Demo,僅僅實(shí)現(xiàn)了本地預(yù)覽,拋磚引玉,你還可以在此基礎(chǔ)上輕松實(shí)現(xiàn)對(duì)上傳文件的一些判斷和限制,或者是UI上的提升。
FileReader的能力并不止步于此,不僅僅有readASDataURL這種方法。
不僅是圖片,音樂,視頻都可以實(shí)現(xiàn)對(duì)于的本地預(yù)覽,只要把result屬性的值,賦值給對(duì)應(yīng)的audio或video標(biāo)簽的src屬性即可,不過因?yàn)閮?nèi)存限制,讀取視頻往往失敗。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
laypage+SpringMVC實(shí)現(xiàn)后端分頁(yè)
這篇文章主要為大家詳細(xì)介紹了laypage+SpringMVC實(shí)現(xiàn)后端分頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07JavaScript中字符串與Unicode編碼互相轉(zhuǎn)換的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript中字符串與Unicode編碼互相轉(zhuǎn)換的實(shí)現(xiàn)方法涉及JavaScript編碼、數(shù)據(jù)類型等的轉(zhuǎn)換技巧,需要的朋友可以參考下2015-12-12uniapp動(dòng)態(tài)修改元素節(jié)點(diǎn)樣式詳解
這篇文章主要介紹了uni-app動(dòng)如何態(tài)修改元素節(jié)點(diǎn)樣式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08JavaScript實(shí)現(xiàn)星座查詢功能 附詳細(xì)代碼
最近小編在做一個(gè)項(xiàng)目,其中涉及到一個(gè)模塊關(guān)于星座查詢功能,即在文本框中輸入一個(gè)生日值,點(diǎn)擊按鈕可以得到對(duì)應(yīng)的星座,怎么實(shí)現(xiàn)這個(gè)需求呢?下面小編通過示例代碼給大家介紹下,需要的朋友參考下吧2021-11-11Mozilla 表達(dá)式 __noSuchMethod__
這是一個(gè)很特殊的方法,但是其存在的意義很大。不過很可惜只有firefox支持了。一個(gè)簡(jiǎn)單的例子解釋一下它的用處2009-04-04點(diǎn)擊button獲取text內(nèi)容并改變樣式的js實(shí)現(xiàn)
這篇文章主要介紹了點(diǎn)擊button獲取text內(nèi)容并改變樣式的js實(shí)現(xiàn),經(jīng)測(cè)試非常實(shí)用,需要的朋友可以參考下2014-09-09JavaScript:new 一個(gè)函數(shù)和直接調(diào)用函數(shù)的區(qū)別分析
或許許多人對(duì)此不以為然,在函數(shù)前加 new 關(guān)鍵字,不就是實(shí)例化一個(gè)對(duì)象嗎?但事情顯然沒那么簡(jiǎn)單2013-07-07JavaScript實(shí)現(xiàn)經(jīng)緯度轉(zhuǎn)換成地址功能
這篇文章主要介紹了JavaScript實(shí)現(xiàn)經(jīng)緯度轉(zhuǎn)換成地址,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03