<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 36, comments - 419, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    剛剛做完1個復雜頁面的前端性能優化,這里的優化是針對這個頁面具體的需求單獨做的優化,所以這里不會談那些減少http請求,合并壓縮js,css,圖片合并等等。因為這些是所有頁面都需要做的,如果需要了解這些,可以參考我這篇文章:web高性能開發系列隨筆

     

    頁面介紹:

    該頁面是1個記賬類的頁面,頁面如下:

     

    頁面主要有4部分組成:

    1. 上部的輸入部分(有5大不同的類型,每個類型都是1個單獨的tab,對應內容也不一樣)  

    2. 左邊的分類列表(默認顯示一級分類,點擊展開子類)

    3. 右邊時間選擇區(按月,年,季,自定義時間過濾等等)

    4. 右邊下半部分的數據列表(默認只顯示每條數據基本信息,點擊展開詳細信息) 

     

    可能看到這里大家不覺的這個頁面會很大,那就再細說下,該頁面包含記賬的所有的功能(添加、刪除,修改,分拆,上傳圖片,顯示數據,數據排序),而且每種下拉列表前面都有個"加號"(見輸入部分的下列列表),點擊"加號"都會彈出類似如下的窗口進行添加(總共有8個左右的彈出窗口),所有的這些都是通過js來實現(js代碼總共寫了大概2000行,不含注釋):

     

     

    問題

    該頁面有一些用戶反映比較慢,經過測試也發現,因為頁面比較復雜,js也比較多,所以在IE下速度會比較慢(特別是IE6),而chrome和firefox速度還是可以的,所以這次的優化主要針對IE,當然優化后的其他瀏覽器肯定也會受益。

     

    優化1:彈出窗口的延遲加載

    本來第1個優化不應該寫這個,因為這個優化效果并不是最明顯的。把它放在第一位,是因為個人覺得這種延遲加載的想法還不錯,比較有新意(目前還沒見過網上有人介紹過這種延遲加載)。

     

    入正題,上面說到,該頁面總共有8個彈出窗口,而且每個彈出窗口的都使用了不同的圖片(不少是png),監控發現這些彈出窗口用的png圖片雖然設置了緩存頭(也使用了document.execCommand("BackgroundImageCache", false, true);),但是在IE6下每次都不直接使用緩存,而是發生1個請求,并得到304狀態回應(原因我估計跟使用DD_belatedPNG來處理png圖片有關,因為時間關系還沒深入研究),監控圖如下:

    從圖中可以看出這幾個圖片很影響加載速度,其實一開始我們根本用不上這些彈出窗口的圖片,因為默認都是隱藏的,而且這些彈出窗口,一般用戶都用的比較少。理所當然,我們想到了延遲加載。

     

    想到延遲加載,第一想到就是先不加載彈出窗口的html代碼,這樣就不會加載對應的圖片了,當用戶點擊彈出按鈕的時候,再去后臺加載對應的html代碼。但這樣就有個問題,當用戶點擊"加號"按鈕,用ajax去加載html代碼,用戶明顯就會感覺到半天窗口還沒彈出來,就會連續的點擊,這種用戶體驗肯定是失敗的。

     

    我們想要的延遲加載是先加載html代碼,但不加載html代碼使用的圖片。但用戶點擊"加號"的時候,直接彈出窗口并加載圖片,這樣用戶一點擊就可以看到窗口。那如何實現這種功能了,于是我想到了html的注釋。我們先把所有彈出窗口的html代碼放進注釋中(這樣就不會加載圖片),當用戶點擊"加號"時,用js讀取注釋中的html插入到body中(不需要ajax),然后彈出窗口。

     

    比如有2個彈出窗口,代碼大概如下(并不是完整代碼,不能直接運行):

     

      <script>
    var loaded = new Object();  // 記錄哪些html已經append到body中
    /**
    * 加載html,該html已經以注釋的方式嵌入的html中,eg:
    * <div id="fast_model_lazy">
    * <!--[lazy]>
    * sass
    *  <![endlazy]-->
    * </div>
    */
    function loadHtml(id){
    // 已經加載過,不再加載
    if(loaded[id])
    return false;
    var html = $.trim(document.getElementById(id).innerHTML);
    // 去掉注釋開頭(11位)和結尾(14位)
    html = html.substring(11,html.length-14);
    $(document.body).append($(html));
    loaded[id]=1;
    return true;
    }
    function click1(){
    loadHtml("fast_model_lazy");
    // 彈出窗口
    $("#fast_model_lazy").showDialog();
    }
    function click2(){
    loadHtml("fast_model2_lazy");
    // 彈出窗口
    $("#fast_model2_lazy").showDialog();
    }
    </script>
    <button click="click1()">彈出第一窗口</button>
    <button click="click2()">彈出第二窗口</button>
    <div id="fast_model_lazy">
    <!--[lazy]>
    <div id="fast_model" class="model">
    ....這里省略html
    </div>
    <![endlazy]-->
    </div>
    <div id="fast_model2_lazy">
    <!--[lazy]>
    <div id="fast_model2" class="model">
    ....這里省略html
    </div>
    <![endlazy]-->
    </div>
    

     

    總結:

    這種延遲加載的方式,主要用于延遲圖片的加載,css的應用,js的解析和執行等等,并不是為了延遲加載html。如果是大量的html代碼,比如分頁的數據,

    使用這種方式就不太合適。個人覺的這種加載方式還可以在很多地方用的到的。

     

    后語:

    今天就寫這些,下次再寫寫對該頁面的其他的一些優化。



    [作者]:BearRui(AK-47)
    [博客]: http://www.tkk7.com/bearrui/
    [聲明]:本博所有文章版權歸作者所有(除特殊說明以外),轉載請注明出處.
    英雄,別走啊,幫哥評論下:  

    精彩推薦 好文要頂 水平一般 看不懂 還需努力

    評論

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-14 10:30 by BearRui(AK-47)
    我暈,干嘛了

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-14 12:31 by stone2083
    @BearRui(AK-47)
    Sorry,Sorry.
    你底下的幾個button做的不錯,發覺挺有意思的,就多點了幾下.沒想到居然是發評論用的. :)

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-14 12:34 by BearRui(AK-47)
    呵呵,沒事,^_^

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-15 17:00 by panasia
    好文章,頂一下!這個思路太帥了!不過有個問題,頁面代碼也會增加不少吧。如果JS代碼較多。全寫在頁面上..會不會加載速度也會有影響呢?

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-15 17:12 by BearRui(AK-47)
    @panasia
    頁面代碼跟原來的相比,應該大不了多少,就多了幾行注釋。而JS代碼可以寫成公用的函數,多的代碼行數絕對在100行之內。

    PS:謝謝兄弟常來捧場,以后可以去看我在博客園的博客,博客園人氣好點,而且后臺編輯比blogjava要好很多,我一般在博客園先更新,有些文章可能還沒在Blogjava上發,^_^

    http://www.cnblogs.com/bearstar/

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-18 17:25 by panasia
    好的。。我直接訂閱了。。你的文章都很有技術含量。所以看你有更新我就會過來看看。

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-18 19:03 by BearRui(AK-47)
    @panasia

    謝謝

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-29 14:01 by 風騷的小野豬
    好文章,頂一下!

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2010-07-29 14:36 by BearRui(AK-47)
    @風騷的小野豬

    謝謝支持。

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載[未登錄]  回復  更多評論   

    2011-02-23 21:53 by sodarfish

    牛啊~~
    發現跟facebook的pagelet 還挺像的
    只不過他們是用js加載html字符串,樓主是加載注釋里的html

    # re: 記一復雜頁面的前端優化(1) - 不一樣的延遲加載  回復  更多評論   

    2012-02-28 02:00 by swind
    用textarea 做這個會不會更好些呢
    主站蜘蛛池模板: 亚洲黄页网在线观看| 亚洲av午夜成人片精品网站| 亚洲一级毛片免费在线观看| 中文字幕视频在线免费观看| 相泽亚洲一区中文字幕| 羞羞视频在线观看免费| 亚洲爽爽一区二区三区| 一级毛片无遮挡免费全部| 亚洲日本韩国在线| av片在线观看永久免费| 亚洲午夜福利在线观看| 国产情侣久久久久aⅴ免费| 久久精品国产亚洲AV网站| 日本免费久久久久久久网站| 久久精品国产亚洲AV大全| 在线精品一卡乱码免费| 亚洲乱码一区二区三区国产精品| 最近中文字幕无吗高清免费视频| 亚洲heyzo专区无码综合| 亚洲成A人片77777国产| 久久99精品免费一区二区| 亚洲人成亚洲精品| 日本亚洲免费无线码| 亚洲人成色777777老人头| 免费人成激情视频| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲真人无码永久在线| 日韩免费高清播放器| 亚洲小视频在线播放| 免费看a级黄色片| 一区二区三区免费看| 亚洲综合婷婷久久| 女人与禽交视频免费看| 一个人看的www免费在线视频| 亚洲V无码一区二区三区四区观看 亚洲αv久久久噜噜噜噜噜 | 亚洲午夜久久久久久久久电影网 | 亚洲香蕉免费有线视频| 日本一道在线日本一道高清不卡免费| 麻豆va在线精品免费播放| 久久精品国产亚洲夜色AV网站| 美女视频黄的全免费视频|