這篇文章介紹一種使用代理設計模式(Proxy Design Pattern)的方法來改善您的前端應用裏圖片加載的體驗。前端
假設咱們的應用裏須要顯示一張尺寸很大的圖片,位於遠端服務器。咱們用一些前端框架的Image這個控件類去顯示圖片。若是直接調用控件類的代碼git
image.setSrc("http://www.bigfile.gif"), 那麼在這張具體的圖片真正加載到本地以前,UI上顯示一片空白,這個用戶體驗很差。github
咱們平常生活中其實已經能感受到,不少優秀的前端應用,在加載大尺寸圖片或者執行其餘費時的後臺操做時,前臺都會有一些動畫效果。設計模式
今天咱們就來動手作一個相似的效果出來。瀏覽器
有一個按鈕。點了以後,會觸發一張大尺寸圖片的加載。前端框架
在這張圖片的加載過程當中,一直顯示一張本地的gif圖片做爲加載動畫:服務器
加載完畢後,動畫消失,實際圖片才顯示出來(4.1MB大)。框架
項目完整代碼在我github上:函數
https://github.com/i042416/FioriODataTestTool2014/tree/master/WebContent/buttontutorial/view動畫
看一些關鍵步驟。
1. Image控件定義在XML視圖裏,ID爲jerryImage。我用的SAP UI5前端框架。你們只要領會了思路,能夠容易地遷移到其餘任何前端框架去。
id爲jerryButton的button控件,點擊事件處理函數onPress:
2. 再看控制器的代碼:onPress執行loadImageWithProxy。
loadImageWithProxy調用injectProxy,傳入的輸入參數image就是XML視圖裏定義的Image控件。
在injectProxy裏,代碼第30行建立了一個隱藏的Image代理對象,而後在第36行用真實的Image控件去顯示本地的gif文件,以在UI上顯示出動畫效果,而後第37行用隱藏的Image代理對象去悄悄地加載大尺寸文件,這件事情終端用戶並不知情。等到這個大尺寸圖片加載完畢後,Image代理對象的onload回調函數會被瀏覽器觸發,此時再讓真實的Image控件把加載好的大尺寸文件顯示出來。 效果就實現了。
要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼: