圖片上傳是一個普通不過的功能,而圖片預覽就是就是上傳功能中不可或缺的子功能了。在這之前,我曾經透過訂閱input[type=file]元素的onchange事件,一旦更改路徑則將圖片上傳至伺服器,接著就獲取圖片路徑並賦值到img元素上。先不管文件非同步提交的解決方案,就是服務端清理那些臨時的預覽圖片已經增加不少工作量了。
偶然從MDN找到純前端圖片預覽的相關資料,經過整理後記錄下來以便日後查閱。
一、準備功夫1-FileReader 〜 、 、 、〜 、、 、 、、、
FileReader是HTML5的新特性,用來讀取Blob和File類型的資料。具體的用法如下:
(1). 構造方式
var fr = new FileReader();
(2). 屬性
result:讀取到的文件內容,只讀。
error:類型為DOMError,表示在讀取檔案時發生的錯誤,唯讀。
(3). 方法
abort():中止讀取操作,並將readyState設為DONE。當沒有執行讀取操作時,呼叫該方法會拋DOM_FILE_ABORT_ERR異常。readAsArrayBuffer(Blob blob):讀取數據,result屬性被設定為ArrayBuffer類型
readAsText(Blob blob [, encoding='utf-8']):讀取數據,result屬性被設定為String類型
readAsBinaryString(Blob blob):讀取數據,result屬性被設定為原始二進位資料
readAsDataURL(Blob blob):讀取數據,result屬性被設定為Data URI Scheme形式(具體請瀏覽《JS魔法堂:Data URI Scheme介紹》)
(4).事件
onload:讀取資料成功後觸發onerror:讀取資料時拋異常時觸發
onloadstart:讀取資料前觸發
onloadend:讀取資料後觸發,在onload或onerror後觸發
onabort:中止讀取後觸發
onprogress:讀取過程中週期性觸發
(5).瀏覽器支援
FF3.6+,Chrome7+,IE10+
二、準備功夫2-DXImageTransform.Microsoft.AlphaImageLoader濾鏡
(1). 作用:主要作用是對圖片進行透明處理(IE5.5~6並不支援透明的png)(2). 樣式中的使用方式
#preview{ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="dummy.png"); }
var preview = document.getElementById('preview'); preview.style.filter = preview.currentStyle.filter + ";progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src='dummy.png')"; preview.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src="dummy1.png";
enabled:可選項,設定濾鏡是否啟動。值範圍true(預設),false
sizingMethod:可選項,設定濾鏡作用的圖片在容器邊界內的顯示方式,值範圍crop(剪切圖片以適應容器尺寸),image(預設值,增大或縮小容器尺寸以適應圖片的尺寸),scale(縮放圖片以適應容器尺寸)
src:必填項,使用絕對或相對URL指向背景圖片。當URL為使用者電腦本機位址時有效, 而img元素的src為使用者電腦本機位址時會拋不允許存取本機檔案系統的例外。
三
、實現 🎜> 接下來我們就利用FileReader的readAsDataURL來取得Data URI Scheme來實作圖片預覽的功能,而IE5.5~9我們就使用濾鏡DXImageTransform.Microsoft.AlphaImageLoader來做降級處理。
html片段:
<style type="text/css"> #preview{ width: 100px; height: 100px; } </style> <!--[if lte IE 9]> <style type="text/css"> #preview{ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale); } </style> <![endif]--> <input type="file" onchange="showPreview(this);"/> <div id="preview"> </div>js片段:
var preview = function(el){ var pv = document.getElementById("preview"); // IE5.5~9使用滤镜 if (pv.filters && typeof(pv.filters.item) === 'function'){ pv.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = el.value; } else{ // 其他浏览器和IE10+(不支持滤镜)则使用FileReader var fr = new FileReader(); fr.onload = function(evt){ var pvImg = new Image(); pvImg.style.width = pv.offsetWidth + 'px'; pvImg.style.height = pv.offsetHeight + 'px'; pvImg.src = evt.target.result; pv.removeChild(0); pv.appendChild(pvImg); }; fr.readAsDataURL(el.files[0]); } };
由於IE11作了安全方面的考慮,使得在input[type=file]元素上透過value、outerHTML和getAttribute的方式都無法取得使用者所選檔案的真實位址,只能取得到C:fakepath檔案名稱。因此假如使用IE11,但文字模式卻設定為10以下,那就沒木有辦法實現圖片預覽了。
解決方法 1—在head標籤下加入這句話: 。這樣就可以告訴IE,預設使用目前IE的最高版本解析、渲染網頁了。
解決方法2-採用 document.selection.createRangeColleciton() 取得真實位址,具體操作如下:
五、补充:使用window.URL.createObjectURL代替FileReader
通过FileReader的readAsDataURL方法获取的Data URI Scheme会生成一串很长的base64字符串,若图片较大那么字符串则更长,若页面出现reflow时则会导致性能下降。解决方案如下:
1. 预览的img标签使用绝对定位,从而脱离正常文档流,那么就与文档的其他元素无关了,而reflow时则不会影响性能。
2. 采用 window.URL.createObjectURL(Blob blob) 生成数据链接。
var createObjectURL = function(blob){ return window[window.webkitURL ? 'webkitURL' : 'URL']['createObjectURL'](blob); };
注意: window.URL.createObjectURL 生成的数据链接是独占内存的,因此若不时用时需要调用 window.URL.revokeObjectURL(DOMString objUrl) 来释放内存。在刷新页面时,也会自动释放内容。
var resolveObjectURL = function(blob){ window[window.webkitURL ? 'webkitURL' : 'URL']['revokeObjectURL'](blob); };
以上就是本文的全部内容,希望对大家的学习有所帮助。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。