该如何加载Google-Analytics(或其他第三方)的JS

开发 前端
很多网站为了获取用户访问网站的统计信息,使用了google-analytics或其他分析网站(下面的讨论中只提google-analytics,简称ga)。注册ga后,ga就会生成一段js脚本,很多人直接把这段js复制到的最后面就完事。可是ga自动生成的这段JS真的就是最合理的吗?

哪怎么样才算是合理,怎样才是不合理了?因ga只是1个分析工具,它的使用绝对不能影响到我们的程序,如果影响了,则是不合理的。不影响则是合理的。

目前ga的使用:

先看看ga自动生成的js脚本,如下:

  1. <script type="text/javascript"> 
  2. var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");  
  3. document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' 
  4. type='text/javascript'%3E%3C/script%3E"));  
  5. </script> 
  6. <script type="text/javascript"> 
  7. try {  
  8. var pageTracker = _gat._getTracker("UA-123456-1");  
  9. pageTracker._trackPageview();  
  10. } 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无法加载:

  1.  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. view sourceprint?  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head>  
  6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  7.     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>  
  8.     <script type="text/javascript">  
  9.         $(document).ready(function(){  
  10.             $.get("http://www.126.com/");  
  11.         });  
  12.   </script>    
  13. </head>  
  14. <body>  
  15.     <script type="text/javascript">  
  16.         var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");  
  17.         document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' 
  18. type='text/javascript'%3E%3C/script%3E"));  
  19.         </script>  
  20.         <script type="text/javascript">  
  21.         try {  
  22.         var pageTracker = _gat._getTracker("UA-123456-1");  
  23.         pageTracker._trackPageview();  
  24.         } catch(err) {}</script>  
  25. </body>  
  26. </html>  
  27.      

监控图:

该如何加载google-analytics(或其他第三方)的JS

上图可以看出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. 动态创建

2.使用new Image().src="", 这种方法只会下载JS,而不会解析JS。所以用这个加载js后,里面的函数也不能调用(这种方法一般用于预加载)。

完善后的代码:

  1.     <script type="text/javascript">   
  2.     var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");  
  3.     var head = document.getElementsByTagName("head")[0] || document.documentElement;  
  4.     var script = document.createElement("script");  
  5.     script.src = gaJsHost + "google-analytics.com/ga.js";  
  6.  
  7.     var done = false// 防止onload,onreadystatechange同时执行  
  8.     // 加载完毕后执行,适应所有浏览器  
  9.     script.onload = script.onreadystatechange = function() {  
  10.         if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")){  
  11.             done = true;  
  12.             try {  
  13.                 var pageTracker = _gat._getTracker("UA-123456-16");  
  14.                 pageTracker._trackPageview();  
  15.             } catch(err) {}  
  16.             script.onload = script.onreadystatechange = null;  
  17.         }  
  18.     };   
  19.     head.insertBefore(script,head.firstChild);  
  20. </script> 

上面代码修改自jquery的ajax代码。上面代码很容易理解,动态创建script来加载js,通过onload,或 onreadystatechange 事件来加载完毕后执行代码。

代码修改完毕后再监控测试如下;

该如何加载google-analytics(或其他第三方)的JS

图中看出ga照样加载了20s,但我们的ajax请求并没有等20s后才执行,而是立刻执行了。

jquery 加载ga:

可能你觉的上面的代码写的比较多,比较繁琐,如果你用jquery的话,可以简化成下面这样:
 

  1.  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");  
  2. $.getScript(gaJsHost + "google-analytics.com/ga.js",function(){  
  3. try {  
  4. var pageTracker = _gat._getTracker("UA-123456-16");  
  5. pageTracker._trackPageview();  
  6. catch(err) {}  
  7. }); 

系列专题:http://developer.51cto.com/art/201104/257581.htm

【编辑推荐】

  1. Web设计师应向肖像画家学习的11个经验
  2. 20个新鲜的Web应用 Web设计师不可错过
  3. Ajax和WEB服务数据格式:自定义返回格式
  4. Ajax和WEB服务数据格式:JSON JSONP
  5. Ajax和Web服务数据格式:XML SOAP HTML
责任编辑:陈贻新 来源: BearRui的博客
相关推荐

2015-11-05 16:44:37

第三方登陆android源码

2014-07-25 09:33:22

2014-02-10 10:22:33

微信开发者

2010-11-12 10:57:37

JavaAndroidGoogle

2021-01-27 10:04:46

鸿蒙HarmonyOS动画

2021-04-27 15:30:54

鸿蒙HarmonyOS应用

2018-12-04 10:24:23

VueReactJQuery

2017-12-11 15:53:56

2014-07-23 08:55:42

iOSFMDB

2019-07-30 11:35:54

AndroidRetrofit

2024-01-05 17:29:32

2011-05-03 10:35:46

2022-05-21 23:56:16

Python库搜索Python

2023-07-26 08:21:33

2017-05-16 13:24:02

LinuxCentOS第三方仓库

2019-09-03 18:31:19

第三方支付电商支付行业

2009-12-31 14:38:34

Silverlight

2016-10-21 14:09:10

2017-11-01 06:40:33

2013-04-08 09:28:05

Chrome OS第三方云存储
点赞
收藏

51CTO技术栈公众号