posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

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

           

          目前ga的使用:

           

               先看看ga自動(dòng)生成的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是阻塞加載的,就是這個(gè)js沒加載完,后面的所有資源和JS都不能下載和執(zhí)行。可能你會(huì)覺的這段代碼在body的最后面,后沒已經(jīng)沒內(nèi)容,沒什么會(huì)阻塞的了。

               還有一些你忽略了,相信很多人在寫JS的時(shí)候需要在頁(yè)面加載完畢后執(zhí)行一些JS或AJAX,一般寫在window.onload 事件,或者寫入jquery的$(document).ready()方法中。這些JS就會(huì)被阻塞。如果我們的頁(yè)面上很多數(shù)據(jù)在window.onload中使用AJAX加載,而偏偏這個(gè)時(shí)候ga因?yàn)槟承┰?和諧和諧)不能訪問,或者訪問很慢的時(shí)候。問題就來,我們自己的JS一直在等待ga的JS加載完,只有等ga的js加載超時(shí)后才會(huì)執(zhí)行我們的JS。
             
               
               實(shí)例:
                 下面的代碼使用jquery在document.ready發(fā)送1個(gè)ajax請(qǐng)求(請(qǐng)求126.com)。測(cè)試前修改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>

                 監(jiān)控圖:
               

           

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

           

          合理使用ga:

           

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

          <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同時(shí)執(zhí)行
          // 加載完畢后執(zhí)行,適應(yīng)所有瀏覽器
          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代碼。上面代碼很容易理解,動(dòng)態(tài)創(chuàng)建script來加載js,通過onload,或 onreadystatechange 事件來加載完畢后執(zhí)行代碼。
           
          代碼修改完畢后再監(jiān)控測(cè)試如下;
           
           
          圖中看出ga照樣加載了20s,但我們的ajax請(qǐng)求并沒有等20s后才執(zhí)行,而是立刻執(zhí)行了。
          jquery 加載ga:
              可能你覺的上面的代碼寫的比較多,比較繁瑣,如果你用jquery的話,可以簡(jiǎn)化成下面這樣:
              
          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) {}
          });
          



              有需要請(qǐng)查看:高性能WEB開發(fā)系列



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

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

          評(píng)論

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

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

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

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

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

          2010-05-14 08:58 by swinging
          我理解錯(cuò)了請(qǐng)樓主無視@swinging

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

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

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

          2010-05-16 16:58 by cybergoat
          很不錯(cuò),學(xué)習(xí)了

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

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

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

          2010-06-09 17:00 by panasia
          google的ga.js現(xiàn)在已經(jīng)有異步加載的代碼了。。不過方法很不錯(cuò)。。學(xué)習(xí)了。同在不會(huì)白屏了。

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

          2012-11-22 23:36 by inhv
          請(qǐng)問像 cnzz 這樣的怎樣實(shí)現(xiàn)異步加載 ?
          主站蜘蛛池模板: 光泽县| 信宜市| 高淳县| 古丈县| 大埔县| 灌南县| 濮阳市| 勐海县| 徐闻县| 宜君县| 蕉岭县| 绩溪县| 柞水县| 靖西县| 太仆寺旗| 织金县| 饶河县| 湟源县| 连云港市| 邻水| 高雄县| 沂源县| 文山县| 军事| 宜兴市| 郯城县| 永兴县| 石嘴山市| 海城市| 五河县| 揭阳市| 北海市| 竹溪县| 双牌县| 大悟县| 龙海市| 灵丘县| 梁河县| 荆州市| 锡林浩特市| 无为县|