欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript的動態(tài)加載、緩存、更新以及復(fù)用(一)

 更新時間:2014年06月09日 09:31:24   作者:  
在做OA、MIS、ERP等信息管理類的項目,經(jīng)常會遇到引用很多js文件,這就需要用到動態(tài)加載、緩存、更新以及復(fù)用等技術(shù),下面我們來討論下

使用范圍:

  OA、MIS、ERP等信息管理類的項目,暫時不考慮網(wǎng)站。

遇到的問題:

  完成一個項目,往往需要引用很多js文件,比如jQuery.js、easyUI等。還有自己寫的一些列js文件,那么這些文件如何方便的加載,如果文件有變化如何才能讓客戶端及時更新緩存?如果能夠提高點運行效率,那就更好了。

目標(biāo):

1、  可以方便的引用js文件。

2、  盡量使用各種緩存,避免頻繁從服務(wù)器讀取文件。

3、  如果js文件有更新或者增加、減少幾個減少js文件,需要客戶端能夠自動、立刻更新。

4、  Js文件的復(fù)用。

頁面結(jié)構(gòu):

  一般OA、MIS這一類的項目,大多采用frameset或者iframe的方式來實現(xiàn),這樣就有了父頁和子頁的概念。我們可以利用這一點來做做文章。

  網(wǎng)頁可以分為三塊:外殼、首頁、標(biāo)簽、數(shù)據(jù)列表、表單(添加、修改)。因為這里要說的加載js的方法,需要利用這種頁面結(jié)構(gòu),也正是因為這個原因,所以暫時不支持網(wǎng)站。

  看這個圖有點眼熟吧。恩,就是這種結(jié)構(gòu)。

正文

  現(xiàn)在做web版的應(yīng)用,越來越依賴各種js了,第三方的jQuery、easyUI、my97等,還有自己寫的各種js。要實現(xiàn)的功能越來越多,需要使用的js也越來越多,js文件的修改也很頻繁。于是就出現(xiàn)了許多問題,比如每個頁面都要寫一大堆<script src=””>。這個也太麻煩了吧,增加一個新的js文件,需要改多少頁面?js文件更新了如何讓客戶端也立即更新?如何讓客戶端更快的加載js。有的Js文件還有依賴關(guān)系,如何確保加載順序?本文內(nèi)容就是分享一下我的解決方案。

動態(tài)加載

  在頁面里使用<script>加載js,顯然很麻煩,那么怎么辦呢?想來想去還是用動態(tài)加載的方法來解決。在網(wǎng)上也搜索了一番,有很多種方法,有自己手動寫的,有整理成框架的(比如seejs)。有的時候還是感覺自己弄一個更加的應(yīng)手,所以打算自己寫一套。

  如何動態(tài)加載呢?使用jQuery提供的方法嗎?這個倒是可以,但是頁面必須引用jQuery和我寫的加載js文件的js。也就是說一個頁面要寫兩個<script>,這個就麻煩了。能寫一個,就一定不要寫兩個,雖然只是多了一個,但是多了這么一個就真的很麻煩。所以決定自己手寫一個動態(tài)加載的小方法。

  不會寫怎么辦呢?百度大嬸來幫忙吧。各種搜呀,終于找到了一個比較理想的方法,恩就用這個了。

復(fù)制代碼 代碼如下:

/*實現(xiàn)動態(tài)加載js的函數(shù),來自于互聯(lián)網(wǎng),做了一點修改,可以兼容IE10 */
var loadscript =
{
    $$: function(id) { return document.getElementById(id); },
    tag: function(element) { return document.getElementsByTagName(element); },
    ce: function(element) { return document.createElement(element); },
    js: function(url, callback) {
        var s = loadscript.ce('script');
        s.type = "text/javascript";
        s.src = url;
        if (document.documentMode == 10 || document.documentMode == 9) {
            s.onerror = s.onload = loaded;
        } else {
            s.onreadystatechange = ready;
            s.onerror = s.onload = loaded;
        }
        loadscript.tag('head')[0].appendChild(s);

        function ready() { /*IE7.0/IE10.0*/
            if (s.readyState == 'loaded' || s.readyState == 'complete') {
                callback();
            }
        }

        function loaded() { /*chrome/IE10.0*/
            callback();
        }
    }
};

加載順序

  和新代碼已經(jīng)搞定了,下面就是如何加載其他js文件了,由于文件比較多,還有一定的依賴關(guān)系,想來想去還是弄個js文件的字典吧,然后做一個加載順序,按照這個順序來加載。

  為了更穩(wěn)定一點,決定采用一個一個加載的方式,即加載完一個js,然后在加載另一個js。這樣就可以確保依賴關(guān)系。當(dāng)然缺點是加載速度會比較慢。一般網(wǎng)頁加載js是可以多個js文件一起下載的,這個速度就會比較快。

使用緩存

  一般瀏覽器對于各種資源(比如網(wǎng)頁、圖片、js、css等)會有一個緩存,已經(jīng)有了就不會再向服務(wù)器去下載了??此坪芎茫怯袃蓚€問題:

    A、瀏覽器如何判斷緩存的js文件是不是最新的?

    B、js文件更新了,如何強制瀏覽器更新?

  瀏覽器是怎么判斷的呢?具體步驟我也不太清楚,只是知道有一個步驟是要到服務(wù)器問問,我緩存的js文件是不是最新的,然后才能夠確定本地的緩存是否是最新的,如果是最新的就不折騰了,如果不是再去下載最新的。就是說呢,即使客戶端已經(jīng)有了js文件的緩存,但是瀏覽器要確認(rèn)一下是否最新,還是會跑到服務(wù)器去問問。這個,折騰呀。當(dāng)然一般情況下,這個過程會很快,但是有時候這個過程會很慢。

  所以呢,還是盡量避免加載js的好。于是就引出來的“js文件的復(fù)用”。

更新js文件

  Js文件更新了,但是瀏覽器卻還在用以前的js文件,因為有緩存了,而且還固執(zhí)的認(rèn)為緩存的js文件就是最新的,哎咋辦呀?

  最簡單的方法就是在加載js的時候,后面跟一個版本號,有更新了,就版本號+1。比如 xxx.js?v=1。Js文件更新后就是 xxx.js?v=2。這樣js就肯定會被更新了。

  看起來似乎很簡單,但是這個版本號如何加上去?版本號本身又如何更新呢?

復(fù)用

  這個就要先看看上面那個圖了,就是頁面結(jié)構(gòu),有一個外殼頁(或者首頁),我們叫做父頁。里面還有若干個iframe加載的頁面,我們加做子頁。

  一般的做法是,父頁里加載jQuery.js,然后子頁里也要加載jQuery.js。當(dāng)然當(dāng)子頁在加載jQuery.js的時候,直接從緩存里面提取,一般不會再去折騰服務(wù)器了。

  但是,既然父頁里面已經(jīng)加載了,子頁為啥還要再加載一次?直接用父頁里加載好的行不行呢?到網(wǎng)上搜了一下,似乎沒有人這么做。也許是我太另類了吧,我就是想實現(xiàn)這個方法。優(yōu)點就是,所有的js文件都在父頁里加載,子頁直接使用父頁里加載好的js,這樣子頁就不需要在折騰js文件了。這樣效率也可以更高一些,畢竟即使用緩存里加載,也是要判斷一下,然后在做個加載的動作,還是會有一點點損耗,js文件越多也就越明顯。

  那么如何實現(xiàn)呢,想想似乎很簡單。

  父頁里使用jQuery

  Var aa = $('div');  //找到父頁里的所有div

  子頁里是不是可以這么做?

  Var  bb = top.$ ('div') ; //能夠找到div,但是不是子頁的div而是父頁里的div。

  咋回事呢?原因就在于搜索范圍。jQuery是有三個參數(shù)的,我們平時只用了第一個,后面的就被忽略了。那么第二個參數(shù)是啥呢?就是搜索范圍。沒有指定的時候,jQuery會在哪里搜索呢?加載jQuery的頁面里面搜索,而不是調(diào)用$的頁面里搜索。

  解決方法也很簡單,加個參數(shù)就好了

  Var  bb = top.$ ('div',document) ; //指定搜索范圍:子頁的document

  等等,這個似乎很煩人,我們在寫腳本的時候,還要考慮一下,這個腳本是在父頁里執(zhí)行還是在子頁里執(zhí)行嗎?

  好了,做一個簡單的封裝,避免這個麻煩。子頁里寫個函數(shù)

復(fù)制代碼 代碼如下:

function $ (p1){
         return top.$ (p1,document);
}

 

  好了,大功告成了嗎?當(dāng)然沒有!預(yù)知后事如何,請聽下回分解。

ps:下集預(yù)告。就是具體的實現(xiàn)代碼,還有一些思路和想法,不知道大家還有啥想知道的沒,有的話,歡迎在下面回復(fù)一下。謝謝先。


 

相關(guān)文章

  • JS實現(xiàn)一個按鈕的方法

    JS實現(xiàn)一個按鈕的方法

    這篇文章主要介紹了JS實現(xiàn)一個按鈕的方法,實例分析了使用js實現(xiàn)一個按鈕的功能與相關(guān)技巧,需要的朋友可以參考下
    2015-02-02
  • 微信小程序?qū)崿F(xiàn)登錄頁云層漂浮的動畫效果

    微信小程序?qū)崿F(xiàn)登錄頁云層漂浮的動畫效果

    微信小程序目前的火熱程度相信不用多言,最近利用空余時間用小程序?qū)崿F(xiàn)了個動態(tài)的登錄頁效果,所以下面這篇文章主要給大家介紹了利用微信小程序?qū)崿F(xiàn)登錄頁云層漂浮動畫效果的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • JS實現(xiàn)拖動模糊框特效

    JS實現(xiàn)拖動模糊框特效

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)拖動模糊框特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 微信小程序中使用vant組件庫的超詳細(xì)圖文教程

    微信小程序中使用vant組件庫的超詳細(xì)圖文教程

    說到vant框架相信大家應(yīng)該并不陌生了吧,做過移動端開發(fā)的小伙伴們應(yīng)該都知道它吧,下面這篇文章主要給大家介紹了關(guān)于微信小程序中使用vant組件庫的超詳細(xì)圖文教程,需要的朋友可以參考下
    2023-03-03
  • html代碼調(diào)試腳本

    html代碼調(diào)試腳本

    html代碼調(diào)試腳本...
    2006-07-07
  • JS實現(xiàn)簡單Tab欄切換案例

    JS實現(xiàn)簡單Tab欄切換案例

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)簡單Tab欄切換案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)

    詳解js如何優(yōu)雅處理后端返回的單元格數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何優(yōu)雅處理后端返回的單元格數(shù)據(jù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • JavaScript?雙位非運算(~~?操作符)使用場景實例探索

    JavaScript?雙位非運算(~~?操作符)使用場景實例探索

    本文為大家介紹JavaScript中雙位非運算?~~,?~~?操作符是一個強大且經(jīng)常被忽視的特性,它提供了一種快速、簡潔的方式來處理數(shù)字和執(zhí)行類型轉(zhuǎn)換,通??梢员挥糜跀?shù)學(xué)計算和類型轉(zhuǎn)換,我們先了解一下?~~?的基本概念和它的一些應(yīng)用場景
    2024-01-01
  • 使用pjax實現(xiàn)無刷新更改頁面url

    使用pjax實現(xiàn)無刷新更改頁面url

    pjax=pushState+ajax,相信用過github的同學(xué)都知道,github部分頁面采用了pjax這個項目來實現(xiàn)ajax無刷新加載的同時改變頁面url。一起來學(xué)習(xí)一下這個插件吧。
    2015-02-02
  • JS組件Bootstrap Table使用實例分享

    JS組件Bootstrap Table使用實例分享

    這篇文章主要為大家詳細(xì)介紹了JS組件Bootstrap Table分頁使用方法,具有一定的實用性,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論