<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

         很多網站為了獲取用戶訪問網站的統計信息,使用了google-analytics或其他分析網站(下面的討論中只提google-analytics,簡稱ga)。注冊ga后,ga就會生成一段js腳本,很多人直接把這段js復制到<body>的最后面就完事(包括 博客園、CSDN、BlogJava)。可是ga自動生成的這段JS真的就是最合理的嗎?

         哪怎么樣才算是合理,怎樣才是不合理了?因ga只是1個分析工具,它的使用絕對不能影響到我們的程序,如果影響了,則是不合理的。不影響則是合理的。

     

    目前ga的使用:

     

         先看看ga自動生成的js腳本,如下:
    <script type="text/javascript"> 
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    </script> 
    <script type="text/javascript"> 
    try {
    var pageTracker = _gat._getTracker("UA-123456-1");
    pageTracker._trackPageview();
    } catch(err) {}</script> 

     

          看這段代碼,使用document.write來加載JS,注意了,這樣加載js是阻塞加載的,就是這個js沒加載完,后面的所有資源和JS都不能下載和執行。可能你會覺的這段代碼在body的最后面,后沒已經沒內容,沒什么會阻塞的了。

         還有一些你忽略了,相信很多人在寫JS的時候需要在頁面加載完畢后執行一些JS或AJAX,一般寫在window.onload 事件,或者寫入jquery的$(document).ready()方法中。這些JS就會被阻塞。如果我們的頁面上很多數據在window.onload中使用AJAX加載,而偏偏這個時候ga因為某些原因(和諧和諧)不能訪問,或者訪問很慢的時候。問題就來,我們自己的JS一直在等待ga的JS加載完,只有等ga的js加載超時后才會執行我們的JS。
       
         
         實例:
           下面的代碼使用jquery在document.ready發送1個ajax請求(請求126.com)。測試前修改host文件,讓ga的js無法加載:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ">
    <html xmlns="
    >
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script type="text/javascript" src="
    ></script>
        <script type="text/javascript">
            $(document).ready(function(){
                $.get("

            });
      </script>   
    </head>
    <body>
        <script type="text/javascript">
            var gaJsHost = (("https:" == document.location.protocol) ? "
    https://ssl." : "http://www.");
            document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
            </script>
            <script type="text/javascript">
            try {
            var pageTracker = _gat._getTracker("UA-123456-1");
            pageTracker._trackPageview();
            } catch(err) {}</script>
    </body>
    </html>

           監控圖:
         

     

    上圖可以看出ga加載不了,在20秒超時后,才執行我們的ajax請求,我們的ajax請求才花0.173s,但卻等了20s。

     

    合理使用ga:

     

       要合理使用ga,需要解決2個問題:
          1. 如何非加載ga的js,
          2. 如何在ga的ja加載完畢后立刻執行 var pageTracker = _gat._getTracker("UA-123456-1");pageTracker._trackPageview(); 代碼。
      
       非阻塞加載js的方法,主要有2種:
          1. 動態創建<script標簽
          2.使用new Image().src="", 這種方法只會下載JS,而不會解析JS。所以用這個加載js后,里面的函數也不能調用(這種方法一般用于預加載)。
         
       完善后的代碼:

    <script type="text/javascript">
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    var head = document.getElementsByTagName("head")[0] || document.documentElement;
    var script = document.createElement("script");
    script.src = gaJsHost + "google-analytics.com/ga.js";

    var done = false; // 防止onload,onreadystatechange同時執行
    // 加載完畢后執行,適應所有瀏覽器
    script.onload = script.onreadystatechange = function() {
        if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")){
            done = true;
            try {
                var pageTracker = _gat._getTracker("UA-123456-16");
                pageTracker._trackPageview();
            } catch(err) {}
            script.onload = script.onreadystatechange = null;
        }
    };
    head.insertBefore(script,head.firstChild);
    </script>

    上面代碼修改自jquery的ajax代碼。上面代碼很容易理解,動態創建script來加載js,通過onload,或 onreadystatechange 事件來加載完畢后執行代碼。
     
    代碼修改完畢后再監控測試如下;
     
     
    圖中看出ga照樣加載了20s,但我們的ajax請求并沒有等20s后才執行,而是立刻執行了。
    jquery 加載ga:
        可能你覺的上面的代碼寫的比較多,比較繁瑣,如果你用jquery的話,可以簡化成下面這樣:
        
    var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    $.getScript(gaJsHost + "google-analytics.com/ga.js",function(){
    try {
    var pageTracker = _gat._getTracker("UA-123456-16");
    pageTracker._trackPageview();
    } catch(err) {}
    });
    



        有需要請查看:高性能WEB開發系列



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

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

    評論

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-14 08:45 by swinging
    只要把script放在body標簽之后,別放在body里面,這樣用jquery的ready函數。

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-14 08:51 by swinging
    高性能WEB開發系列寫得不錯,留著以后參考

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-14 08:58 by swinging
    我理解錯了請樓主無視@swinging

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-14 16:14 by BearRui(AK-47)
    呵呵,以后都來捧場,^_^

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-16 16:58 by cybergoat
    很不錯,學習了

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-05-16 17:56 by BearRui(AK-47)
    謝謝,^_^

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2010-06-09 17:00 by panasia
    google的ga.js現在已經有異步加載的代碼了。。不過方法很不錯。。學習了。同在不會白屏了。

    # re: 該如何加載google-analytics(或其他第三方)的JS  回復  更多評論   

    2012-11-22 23:36 by inhv
    請問像 cnzz 這樣的怎樣實現異步加載 ?
    主站蜘蛛池模板: 日本黄页网站免费| 9420免费高清在线视频| 国产成人精品高清免费| 亚洲综合色7777情网站777| 亚洲免费电影网站| 亚洲国产精品一区二区久| 青娱分类视频精品免费2| 亚洲情A成黄在线观看动漫软件| 一个人免费高清在线观看| 亚洲婷婷第一狠人综合精品| 手机在线毛片免费播放| 蜜芽亚洲av无码一区二区三区| 四虎影在线永久免费观看| 麻豆安全免费网址入口| 亚洲欧洲日产国码无码网站| 成人A片产无码免费视频在线观看| 亚洲AV日韩AV永久无码绿巨人| 亚洲免费福利在线视频| 亚洲日本天堂在线| 免费人成在线观看网站品爱网日本| 国产精品青草视频免费播放| 国产成人A人亚洲精品无码| 免费国产黄网站在线观看| 亚洲欧洲综合在线| 暖暖免费高清日本一区二区三区| 国产亚洲一卡2卡3卡4卡新区 | 久久夜色精品国产噜噜亚洲a| AV免费网址在线观看| 日韩精品免费一线在线观看| 亚洲愉拍99热成人精品热久久| 99视频精品全部免费观看| 亚洲精品成a人在线观看夫| 亚洲一区二区三区AV无码| 24小时日本电影免费看| 亚洲av无码一区二区三区在线播放| 亚洲熟妇少妇任你躁在线观看无码 | 中文文字幕文字幕亚洲色| 免费国产真实迷j在线观看| 很黄很污的网站免费| 亚洲乱色熟女一区二区三区蜜臀| 综合久久久久久中文字幕亚洲国产国产综合一区首 |