1. 程式人生 > >js的動態載入、快取、更新以及複用(四)

js的動態載入、快取、更新以及複用(四)

  本來想一氣呵成,把載入的過程都寫了,但是卡著呢,所以只好在分成兩份了。

  1、頁面裡使用<script>來載入 boot.js 。

  2、然後在boot.js裡面動態載入 bootLoad.js。以時間作為標識 var dateVer = date.getYear() + '_' + date.getMonth() + '_' + date.getDate() + '_' + date.getHours(); 這樣可以保證一小時內肯定會被更新。同時也避免了每次都去更新。

  3、boot.js裡面根據情況呼叫 bootLoad.js裡提供的函式。目的是為了把有可能變化的都放在 bootLoad.js 裡面以便於能夠控制更新。

  4、如果是top頁面,則呼叫bootLoad.js裡的Nature.Top.topLoad(loads, kind); ;如果是子頁面則呼叫 top.Nature.Top.sonLoad(loads, kind,window);  進行後續處理。

  5、topLoad(),首先獲取最新的版本號,然後載入Nature.LoadJs.js,實現其他js的檔案的載入。如果js檔案有更新,那麼獲取的最新版本號就會發生變化,這樣就可以實現js檔案的及時更新了

  6、sonLoad()則會載入Nature.Adapter.js,實現複用,就是讓子頁面可以呼叫top頁面裡的js。

  簡單的說呢就是這樣。詳細說的話還有很多細節。目前boot.js基本穩定。bootLoad.js也差不多了。Nature.LoadJs.js還需要在改一改。以前寫的太亂了。

boot.js的程式碼。

 1 /*
 2 
 3 載入js指令碼的一種解決方法。
 4 
 5 by 金色海洋 2013-7-11 
 6 
 7 */
 8 
 9 //1毫秒後開始載入 js檔案 
10 window.setTimeout(function() {
11 
12     //判斷有無配置資訊————沒有的話,載入且快取
13     //判斷有無js檔案版本號——沒有的話,載入且快取
14     //載入Nature.LoadJs.js,開始載入其他js
15     //判斷頁面是否有jsReady,如果有則開始呼叫
16 
17     //var bootScript = $("script").frist(); //獲取標籤
18 //var pageKind = bootScript.attr("pageKind"); //獲取標籤裡的屬性 19 20 var kind = (typeof pageKind == "string") ? pageKind : "index"; /*預設的網頁型別*/ 21 22 var loads = new loadscript(document); //把本頁面作為引數傳遞進去。因為涉及到複用,所以要new一下。 23 24 if (typeof top.Nature == "undefined") { 25 //沒有配置資訊,載入。用y_MM_dd_HH作為版本標誌,一個小時更新一次。因為可以快取配置資訊,所以不是每次都讓瀏覽器載入 26 var date = new Date(); 27 var dateVer = date.getYear() + '_' + date.getMonth() + '_' + date.getDate() + '_' + date.getHours(); 28 29 //載入第一個主程式。分開的目的是為了可以控制更新。 30 loads.js('/bootLoad.js?rnd=' + dateVer, function () { 31 Nature.Top.topLoad(loads, kind); //走top頁面的流程 32 }); 33 } else { 34 //走子頁面的流程,把子頁面(window)作為引數傳遞進去,以便於和top頁面區分。因為函式是放在top頁面裡的。 35 //sonLoad不在子頁面裡,而是存在於top裡,所以要 top.sonLoad 36 top.Nature.Top.sonLoad(loads, kind, window); 37 } 38 39 40 /*實現動態載入js的函式,來自於網際網路,做了一點修改,可以相容IE10。IE11沒測試。 41 * 寫在函式裡面,不汙染window了。 42 * 增加載入css的函式 43 * 原來是靜態的,現在改成需要例項化的。 44 */ 45 function loadscript(doc) { 46 this.js = function(url, callback) { 47 var s = doc.createElement('script'); 48 s.type = "text/javascript"; 49 s.src = url; 50 s.expires = 1; 51 load(s, callback); 52 }; 53 this.css = function (url, callback) { 54 var l = doc.createElement('link'); 55 l.type = "text/css"; 56 l.rel = "stylesheet"; 57 l.media = "screen"; 58 l.href = url; 59 //doc.getElementsByTagName('head')[0].appendChild(l); 60 load(l, callback); 61 }; 62 63 function load(s, callback) { 64 switch (doc.documentMode) { 65 case 9: 66 case 10: 67 case 11: 68 s.onerror = s.onload = loaded; 69 break; 70 default: 71 s.onreadystatechange = ready; 72 s.onerror = s.onload = loaded; 73 break; 74 } 75 doc.getElementsByTagName('head')[0].appendChild(s); 76 77 function ready() { /*IE7.0/IE10.0*/ 78 if (s.readyState == 'loaded' || s.readyState == 'complete') { 79 if (typeof callback == "function") callback(); 80 } 81 } 82 83 function loaded() { /*chrome/IE10.0*/ 84 if (typeof callback == "function") callback(); 85 } 86 } 87 } 88 89 }, 1);

bootLoad.js

  1 /*
  2 
  3 載入js指令碼的一種解決方法。
  4 
  5 by 金色海洋 2013-7-11 
  6 
  7 2014-06-07 移植
  8 
  9 */
 10  
 11 var Nature = {};/* 定義 一個很大的物件 */
 12 Nature.Top = {};/* 載入js用的名稱空間 */
 13 
 14 /*資料庫的設定*/
 15 Nature.WebConfig = {
 16     isShowPeiZhi: true,         //頁面裡是否顯示“配置”,程式設計師編輯時設定為 true。上線後設置為 false
 17     WebappID: 7,
 18     dbid_236Write: "2,4",       //統一管理資料連線標識
 19     dbid_236WriteJM: "2,14",    //統一管理資料連線標識
 20 
 21     dbid_236SysLog: "2,6",       //wcf日誌資料庫
 22 
 23     dbid_Loan: "2,13",       //快易貸測試資料庫
 24     //dbid_Loan: "2,12"        //快易貸正式資料庫
 25 
 26 };
 27 
 28 /*ajax的設定*/
 29 Nature.AjaxConfig = {
 30     UrlResource:    "http://LCNatureResource.517.cn",  /*增刪改查服務的網址*/
 31     Urljs:          "http://LCNatureResource.517.cn",  /*js檔案的網址*/
 32     Urlsso:         "http://LCNatureService.517.cn",   /*單點登入的網址*/
 33     Urlcss:         "http://mango-js.517.cn",          /*css檔案的網址*/
 34     
 35     ajaxDataType: "json"                            /*跨域的時候用jsonp,不用跨域的話用json,cors跨域的話也是json*/
 36 };
 37 
 38 Nature.AjaxConfig.UrljsVer   = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/ver.js",  /*存放js檔案版本號的網址*/
 39 Nature.AjaxConfig.UrlLoadJs  = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.LoadJs.js", /*載入其他js檔案的網址*/
 40 Nature.AjaxConfig.UrlAdapter = Nature.AjaxConfig.Urljs + "/Scripts/NatureAjax/Nature.Adapter.js", /*適配的網址*/
 41 
 42 
 43 /* 複用父頁面裡的js檔案的時候使用。是否使用自己頁的js。true:本頁載入js檔案。false:使用父頁的js檔案。*/
 44 //Nature.isSelfJs = false;
 45 
 46 Nature.Top.LoadCss = function(loadCss) {
 47     var cssUrl = Nature.AjaxConfig.Urlcss;
 48     loadCss.css(cssUrl + '/websiteStyle/mangoGlobal.css');
 49     loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/mis-style-p.css');
 50     loadCss.css(cssUrl + '/misStyle/misUICss/misStyle/MisStyle_v2.css');
 51     loadCss.css(cssUrl + '/misStyle/debugCss/css.css');
 52     loadCss.css(Nature.AjaxConfig.UrlResource + '/Scripts/css/css2.css');
 53 };
 54 
 55 //外殼頁的載入
 56 Nature.Top.topLoad = function(loadscript, kind) {
 57     //判斷有無配置資訊————沒有的話,載入且快取      
 58     //判斷有無js檔案版本號——沒有的話,載入且快取  
 59     //載入Nature.LoadJs.js,開始載入其他js
 60     //判斷頁面是否有jsReady,如果有則開始呼叫
 61 
 62     /*載入css檔案*/
 63     Nature.Top.LoadCss(loadscript);
 64     
 65     //載入js版本號
 66     
 67     var checkCount = 0;
 68     if (typeof Nature.jsVer == "undefined") {
 69         /*載入js檔案的版本號,用於更新瀏覽器的js快取檔案。使用隨機數作為引數,保證版本號是最新的。
 70         * 用隨機數保證最新,因為可以快取,所以不是每次訪問都會去載入
 71         */
 72         loadscript.js(top.Nature.AjaxConfig.UrljsVer + '?rnd=' + Math.random(), function() { // 
 73             loadOtherJs();
 74         });
 75     } else {
 76         loadOtherJs();
 77     }
 78 
 79     //載入Nature.LoadJs
 80     function loadOtherJs() {
 81         /*得到了版本號,載入LoadJs.js,該檔案載入其他需要的js檔案*/
 82         loadscript.js(top.Nature.AjaxConfig.UrlLoadJs + Nature.jsVer, function () {
 83             var loadJs = new Nature.loadFile(document);
 84             loadJs.startLoadJs(kind, checkReady);
 85         });
 86     }
 87 
 88     /*檢查頁面是否有jsReady */
 89     function checkReady() {
 90         if (typeof jsReady == "function") {
 91             //執行頁面裡的函式
 92             jsReady();
 93         } else {
 94             //檢查次數,嘗試十次,超了就不玩了,避免死迴圈。*/
 95             if (checkCount < 10) {
 96                 checkCount++;
 97                 setTimeout(checkReady, 50);
 98             }
 99         }
100     }
101 
102 };
103 
104 //子頁的載入
105 Nature.Top.sonLoad = function(loadscript, kind, win) {
106     var checkCount = 0;
107 
108     top.Nature.Top.LoadCss(loadscript);
109     win.Nature = {};
110     
111     loadscript.js(top.Nature.AjaxConfig.UrlAdapter + top.Nature.jsVer, function () {
112         win.Nature.Adapter(win);
113         checkReady();
114     });
115    
116     /*檢查頁面是否有jsReady */
117     function checkReady() {
118         if (typeof win.jsReady == "function") {
119             //執行頁面裡的函式
120             win.jsReady();
121         } else {
122             //檢查次數,嘗試十次,超了就不玩了,避免死迴圈。*/
123             if (checkCount < 10) {
124                 checkCount++;
125                 setTimeout(checkReady, 50);
126             }
127         }
128     }
129 };
130   

下次就是 Nature.LoadJs.js 的介紹了。

相關推薦

js動態載入快取更新以及

  本來想一氣呵成,把載入的過程都寫了,但是卡著呢,所以只好在分成兩份了。   1、頁面裡使用<script>來載入 boot.js 。   2、然後在boot.js裡面動態載入 bootLoad.js。以時間作為標識 var dateVer = date.getYear() + '_

js動態載入快取更新以及

總體思路 1、  建立一個js服務,該服務實現通用js檔案的載入、依賴、快取、更新以及複用。 2、  各個專案如果使用通用js,可(bi)以(xu)使用js服務實現載入。 3、  Js服務只提供通用的js,比如jQuery、my97、easyUI等(可根據實際情況設定具體的js檔案)。 4、  其他針

js動態載入快取更新以及

使用範圍:   OA、MIS、ERP等資訊管理類的專案,暫時不考慮網站。 遇到的問題:   完成一個專案,往往需要引用很多js檔案,比如jQuery.js、easyUI等。還有自己寫的一些列js檔案,那麼這些檔案如何方便的載入,如果檔案有變化如何才能讓客戶端及時更新快取?如果能夠提高點執行效率,

js動態載入快取更新以及

  上一篇發出來後得到了很多回復,在此首先感謝大家的熱情捧場!有的推薦第三方框架,比如 In.js、requrieJS、sea.js、lab.js等。這個開闊了眼界,以前只知道sea.js,省去了自己搜尋的麻煩。也用了點時間簡單看了一下,因為每一個都是大塊頭,都有自己的理念,如果只是簡單使用的話,那麼誰便

3膨脹的牛牛--全國模擬

style 包括 ios ria stream 包含 cnblogs 全國 cout [編程題] 膨脹的牛牛 時間限制:1秒 空間限制:32768K 牛牛以草料為食。牛牛有一天依次遇到n堆被施展了魔法的草料,牛牛只要遇到一堆跟他當前相同大小的草料,它就會把草料吃完,而使自己

PHPMySQL和JavaScript學習手冊筆記

元素 book 個數 爆炸 foreach 學習 mysql 手冊 一個 第六章 數組 $myIndexArray=array(‘apple‘,‘banana‘,‘cat‘,‘dog‘);` $myArray=array(‘book‘=>200,

IO多路-- SelectPollEpoll

在上一篇博文中提到了五種IO模型,關於這五種IO模型可以參考博文IO模型淺析-阻塞、非阻塞、IO複用、訊號驅動、非同步IO、同步IO,本篇主要介紹IO多路複用的使用和程式設計。 IO多路複用的概念 多路複用是一種機制,可以用來監聽多種描述符,如果其中任意一個描述符處

IO多路 -- selectpollepoll實現TCP反射程式

接著上文IO多路複用(一)-- Select、Poll、Epoll,接下來將演示一個TCP回射程式,原始碼來自於該博文https://www.cnblogs.com/Anker...,在這裡將其進行了整合,突出select、poll和epoll不同方法之間的比較,但

Android-動態載入外掛化的兩種實現方式:介面

上一篇部落格中http://blog.csdn.net/lxping51/article/details/71480239,主要通過反射的方式來實現動態載入外掛化,今天我們以介面的方式來達到目的。介面的實現比反射更為簡單,而且直接呼叫對效能有很大的提高。但是這也

QTVS常見bug及解決辦法——錯誤    1    error LNK2019: 無法解析的外部符號

問題1:無法解析的外部符號 "void __cdecl cv::fastFree(void *)" 錯誤 1 error LNK2019: 無法解析的外部符號 "void __cdecl cv::fastFree(void *)" ([email protecte

PHP擴充套件開發之動態載入so模組與靜態重編譯PHP

動態載入so模組:利用ext_skel工具編譯生成so模組,修改php.ini檔案,動態載入即可 靜態編譯:將編寫的模組靜態編譯到PHP,需要重新編譯PHP 假設要編寫一個my_dynamic擴充套件,呼叫my_dynamic函式後輸出字串“The Best

更新】Essential Studio for ASP.NET MVC更新至2018 v4

下載Essential Studio for ASP.NET MVC最新版本 Essential Studio for ASP.NET MVC控制元件包是一款MVC介面開發包,它包含了幾乎所有企業級Web應用程式開發所需要的控制元件,如Grids、 Charts、Gauges、Menus、Calenda

經驗總結-完整介紹Android Studio中Git的使用之GitHub更新程式碼到本地

Git系列三已經介紹完上傳程式碼,那當GitHub上增加了其它開發人員的程式碼,我們要更新到自己的本地倉庫上(或者說更新到自己的本地專案上)怎麼做呢?其實很簡單呢: 當我們要更新程式碼時,就要執行G

延遲載入快取spring與宣告式事務

什麼是延遲載入 延遲載入又稱(懶載入) resultMap中的 association 和 collection 標籤就具有延遲載入的功能(一對一,一對多的關係自帶延遲載入,在開發裡面最常用的) - 作用是:什麼時候用什麼時候載入 設定延遲載入 <!

mybatis基礎系列——關聯查詢延遲載入一級快取與二級快取

關本文是Mybatis基礎系列的第四篇文章,點選下面連結可以檢視前面的文章: mybatis基礎系列(三)——動態sql mybatis基礎系列(二)——基礎語法、別名、輸入對映、輸出對映 mybatis基礎系列(一)——mybatis入門 關聯查詢 在進行表設計時,往往需要在具體的業務基礎上分析表與表之間的

基於OkHttp Retrofit RxJava 多執行緒下載。請求快取自動更新.限制佇列數.封裝庫

XDownload介紹 本庫封裝基於Okhttp3,Retrofit2,RxJava2.0,Greendao3.2 ps : 當然當然,都封裝好了,你也可以無視 GitHub地址 如果你覺得好用,對你有幫助,請給個star 介面

iOS Http網路請求快取及網路資料更新才請求

iOS網路快取掃盲篇 --使用兩行程式碼就能完成80%的快取需求 目錄 由於微信、QQ、微博、這類的應用使用快取很“重”,使一般的使用者也對快取也非常習慣。快取已然成為必備。 快取的目的的以空間換時間 這句話在動輒就是 300M、600M 的大應用上,得到了

偽共享快取行填充以及CPU快取機制

關於偽共享的一篇好文,轉載自: 1.認識CPU Cache CPU Cache概述 隨著CPU的頻率不斷提升,而記憶體的訪問速度卻沒有質的突破,為了彌補訪問記憶體的速度慢,充分發揮CPU的計算資源,提高CPU整體吞吐量,在CPU與記憶體之間引入了一級Cach

.Net微服務實踐[閘道器]:Ocelot限流熔斷快取以及負載均衡

目錄限流熔斷快取Header轉化HTTP方法轉換負載均衡注入/重寫中介軟體後臺管理最後 在上篇.Net微服務實踐(三)[閘道器]:Ocelot配置路由和請求聚合中我們介紹了Ocelot的配置,主要特性路由以及服務聚合。接下來,我們會介紹Ocelot的限流、熔斷、快取以及負載均衡。 限流 我們先來看限流的配置

強類型語言/弱類型語言動態語言/靜態語言編譯型語言/解釋型語言整理

編程範式【強類型語言/弱類型語言】強類型語言偏向於不容忍隱式類型轉換。強類型語言有 Java、C#、Python 等。示例如下(Python):>>> 67 + 8 75 >>> 67 + '8' Traceback (most recent call la