天天看點

使用ExtJs開發MIS系統(2):Js的動态加載

對于一個複雜的系統來說,用戶端的JS可能會有上百個,如果全部加載到使用者的浏覽器中,一方面會導緻多餘的網絡傳輸,另一方面浏覽器解析大量的Js會導緻性能下降,這兩點都會顯著的影響使用者可察覺性能。是以對于Js的加載,是動态進行的,這個動态進行表現為兩種方式:

能不加載的Js就絕不加載。

需要加載的Js在直到确實用到的時候才加載。

拿登陸的流程為例:

使用ExtJs開發MIS系統(2):Js的動态加載

嘗試登陸包含兩種情況,一種是使用者重新整理頁面時,嘗試根據目前的令牌自動登陸,另一種是使用者在上一次登入時儲存了使用者名和密碼,這兩種情況無論哪一種登陸成功了,都不需要使用者再次登陸了,進而也就不需要加載FormLogin這個Js了。

對于功能子產品來說,僅當目前使用者具有該子產品的權限時,才會生成顯示相關的菜單項。而今當該子產品的某一個菜單項目第一次被點選時,該子產品的相關Js才會被加載:

使用ExtJs開發MIS系統(2):Js的動态加載

ExtJs中的Ajax調用是異步的,而動态加載Js通常意味着在該Js加載完成後調用一個函數,且該函數可能是要加載的Js中的一個函數,是以上圖對應的代碼應該這樣寫:

當要執行的函數為要加載的Js中包含的函數時,函數名稱當參數傳遞,加載完畢後,調用eval執行該函數。

真正執行加載操作的是Srims.loadJs這個函數,它接受兩個參數:第一個參數是要加載的Js——可以是一個Js,也可以是一個Js數組;第二個參數是加載完畢後的回調函數。當要加載的是一個Js時,加載很簡單:發起Ajax請求,對取得的結果用eval執行,然後eval回調函數;當要加載的是一系列Js時(就像上面代碼中那樣),情況會複雜一點,需要遞歸的調用loadJs,直到所有Js加載完畢,然後eval回調函數。以下是代碼:

請注意第19行,回調函數為本身,導緻了遞歸。

本文轉自冬冬部落格園部落格,原文連結:http://www.cnblogs.com/yuandong/archive/2008/12/18/1357429.html,如需轉載請自行聯系原作者

繼續閱讀