BearRui(AK-47)
花开有时,错过了一日便错过了一季,就象人生错过了相遇,就不再找寻到美丽的相聚
随笔- 39  文章- 2  评论- 1287 
博客园  首页  新随笔  联系  管理  订阅 订阅
该如何加载google-analytics(或其他第三方)的JS

     很多网站为了获取用户访问网站的统计信息,使用了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" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
			<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
				<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
				<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
				<script type="text/javascript">
					$(document).ready(function(){
						$.get("http://www.126.com/");
					});
			  </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.cnblogs.com/BearsTaR/
[声明]:本博所有文章版权归作者所有(除特殊说明以外),转载请注明出处.
标签: js, google-analytics
绿色通道:好文要顶关注我收藏该文与我联系
posted on 2010-05-12 14:49 BearRui(AK-47) 阅读(3875) 评论(47) 编辑 收藏
发表评论
1903715
 回复 引用 查看   
#1楼 2010-05-12 15:32 | wingoo      
ga现在ms已经有了异步加载方式了
 回复 引用 查看   
#2楼[楼主] 2010-05-12 15:34 | Bear.sTaR{R}      
@wingoo
ms也用ga,不是跟google死敌吗?

 回复 引用 查看   
#3楼 2010-05-12 15:38 | Genius Zhang      
引用Bear.sTaR{R}:
@wingoo
ms也用ga,不是跟google死敌吗?

-----------------------------------------
同学,ms是“貌似”不是Microsoft

 回复 引用 查看   
#4楼[楼主] 2010-05-12 15:44 | Bear.sTaR{R}      
@Genius Zhang
哪MS是哪位"高人",在下实在孤陋寡闻啊,~_~。

 回复 引用 查看   
#5楼 2010-05-12 16:18 | Dreampuf      
MaoSi..貌似
 回复 引用 查看   
#6楼[楼主] 2010-05-12 16:25 | Bear.sTaR{R}      
原来如此,理解相差很大啊。:P

刚登录ga去看下下,发现并没有改过来,还是以前的加载方式。


 回复 引用 查看   
#7楼 2010-05-12 17:13 | MicroCoder      
如果第三方js中含有document.write 的话 通过$.getScript() 加载是行不通的。

 回复 引用 查看   
#8楼 2010-05-12 17:29 | wingoo      
这里有些介绍
http://www.williamlong.info/archives/2010.html

 回复 引用 查看   
#9楼[楼主] 2010-05-12 17:31 | Bear.sTaR{R}      
引用MicroCoder:如果第三方js中含有document.write 的话 通过$.getScript() 加载是行不通的。

这个是,js一直阻塞下载的原因,其中就有担心加载的js中有document.write,所有有document.write的js文件都不能通过异步或者defer延迟加载。

 回复 引用 查看   
#10楼[楼主] 2010-05-12 17:35 | Bear.sTaR{R}      
引用wingoo:
这里有些介绍
http://www.williamlong.info/archives/2010.html


看到了,不知道为什么我现在登录ga,新建网站,它自动产生的还是以前的代码,而不是异步代码。

 回复 引用 查看   
#11楼 2010-05-12 17:44 | argu      
佩服楼主对细节的思考
 回复 引用   
#12楼 2010-05-12 17:53 | 楼主分析得很不错[未注册用户]
遇到过楼主同样的问题,觉得第三方的统计是可有可无的!自主开发吧!
 回复 引用 查看   
#13楼 2010-05-12 18:02 | wingoo      
@Bear.sTaR{R}
自动产生的是默认的,需要自己修改的

 回复 引用 查看   
#14楼 2010-05-12 19:17 | micone      
楼主的时钟相当的龊..还腋毛...
 回复 引用 查看   
#15楼[楼主] 2010-05-12 20:21 | Bear.sTaR{R}      
@楼主分析得很不错
引用楼主分析得很不错:遇到过楼主同样的问题,觉得第三方的统计是可有可无的!自主开发吧!


对技术人员来说,第三方统计确实可有可无,但对市场的还是有用的。自己开发费人力物力。而且做得还没专业的好。

 回复 引用 查看   
#16楼[楼主] 2010-05-12 20:22 | Bear.sTaR{R}      
引用wingoo:
@Bear.sTaR{R}
自动产生的是默认的,需要自己修改的

同意你的说法,但很多人都不会去修改,直接copy

 回复 引用 查看   
#17楼[楼主] 2010-05-12 20:23 | Bear.sTaR{R}      
引用micone:楼主的时钟相当的龊..还腋毛...

晕,这位同学的注意力不集中啊,哈哈。等下就把这个时钟给去掉算了

 回复 引用 查看   
#18楼 2010-05-12 21:07 | jelle      
好东西。楼主研究的很深啊。学习了。
 回复 引用 查看   
#19楼[楼主] 2010-05-12 21:21 | Bear.sTaR{R}      
引用argu:佩服楼主对细节的思考

谢谢,^_^

 回复 引用 查看   
#20楼 2010-05-12 23:22 | sohighthesky      
性能,不知道_gat._getTracker("UA-123456-16")._trackPageview(); 多写那30个字节算不算浪费
 回复 引用 查看   
#21楼[楼主] 2010-05-13 01:16 | Bear.sTaR{R}      
引用sohighthesky:性能,不知道_gat._getTracker("UA-123456-16")._trackPageview(); 多写那30个字节算不算浪费


如果严格说来,确实会影响数据量。但什么事都有2面性,把数据量压的很小,必将降低程序的可读性。最主要是看你做的这个性能优化值不值。

 回复 引用 查看   
#22楼 2010-06-05 10:01 | 日心尧亘      
佩服佩服
 回复 引用 查看   
#23楼 2010-07-14 14:33 | 李亮亮      
我试过你的方法了,怎么行不通啊?
 回复 引用 查看   
#24楼[楼主] 2010-07-14 14:35 | BearRui(AK-47)      
@李亮亮
怎么行不同,我们现在网站就是这样使用的,没问题。

 回复 引用 查看   
#25楼 2010-07-14 14:53 | 李亮亮      
我用了你的方法,但它还是把ga.js加载完才加载www.126.com请求。
 回复 引用 查看   
#26楼 2010-07-14 14:54 | 李亮亮      
@BearRui(AK-47)
可以告诉你的网站吗?

 回复 引用 查看   
#27楼[楼主] 2010-07-14 14:55 | BearRui(AK-47)      
贴出你的代码我看看
 回复 引用 查看   
#28楼 2010-07-14 14:57 | 李亮亮      
@BearRui(AK-47)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE>test</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery.get("http://www.126.com");
});
</script>
</HEAD>
<BODY>
<!--GOOGLE统计-->
<script type="text/javascript">
$.getScript("http://www.google-analytics.com/ga.js",function(){
try {
var pageTracker = _gat._getTracker("UA-4227569-2");
pageTracker._trackPageview();
} catch(err)
{

}
});
</script>
</BODY>
</HTML>

 回复 引用 查看   
#29楼[楼主] 2010-07-14 15:17 | BearRui(AK-47)      
@李亮亮
代码没什么问题,先加载ga.js也是有可能的,因为ga.js比较小,126肯定会比较大,加载慢,我们这里讨论的结果并不是ga.js一定是最后加载,而且让ga.js不会阻塞126.com的加载,你可以修改host文件,把
www.google-analytics.com 指向1个不存在的ip试试就知道了。

 回复 引用 查看   
#30楼 2010-07-14 15:23 | 李亮亮      
@BearRui(AK-47)
我就是把www.google-analytics.com指向一个不存在的ip,但还是先加载ga.js,等20s才加载126.com请求。

 回复 引用 查看   
#31楼[楼主] 2010-07-14 16:30 | BearRui(AK-47)      
@李亮亮
我用你的代码测试完全没有问题啊,你可以改成这样再测试下:
jQuery.get("http://www.126.com",function(){alert('完成');});

 回复 引用 查看   
#32楼 2010-07-14 17:02 | 李亮亮      
@BearRui(AK-47)
我试了,还是先加载ga.js等20s才加载126.com请求。
我在想想别的办法。
不过还是谢谢你。

 回复 引用 查看   
#33楼 2010-07-14 18:38 | jingran      
jsp:
<script type="text/javascript">

$(document).ready(function(){

$.get("http://www.126.com/");

});


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

</script>

hosts:
38.75.65.10 www.google-analytics.com

httpWatch:


为什么不行?

 回复 引用 查看   
#34楼[楼主] 2010-07-14 21:04 | BearRui(AK-47)      
@jingran
你的图片看不到,怎么你们都测试不行,我测试都没问题啊?

 回复 引用 查看   
#35楼 2010-07-15 11:17 | 李亮亮      
那个可能跟浏览器有关系,我用的firefox,不知你们用的是哪个浏览器?
 回复 引用 查看   
#36楼[楼主] 2010-07-15 11:53 | BearRui(AK-47)      
@李亮亮
我firefox和IE都测试过,你看看这个网站,也是这样用的,你测试下看会不会出现问题:
http://www.feidee.com/money/

 回复 引用 查看   
#37楼 2010-07-15 14:10 | 李亮亮      
我试了,在我的firefox下还是不行,但在IE和google下是好的。
可能我的firefox有问题。

谢谢你啊!

 回复 引用 查看   
#38楼[楼主] 2010-07-15 14:23 | BearRui(AK-47)      
@李亮亮
^_^ 不客气

 回复 引用   
#39楼 2010-08-27 00:36 | ezcallme[未注册用户]
請問這個ga是不是异步加载的方式了
//Google Analytics
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-ooooxxxx']);
_gaq.push(['_setDomainName', '.com.tw']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
// Google Analytics
另ga代碼可以用外部連結src=""的方式載入到頁面的<head>區塊嗎?
謝謝

 回复 引用 查看   
#40楼[楼主] 2010-08-27 00:39 | BearRui(AK-47)      
@ezcallme
是异步,你现在的代码就是使用的外部链接src啊?

 回复 引用   
#41楼 2010-08-27 01:06 | ezcallme[未注册用户]
謝謝博主回應
我的意思是連這段代碼都把它放進一個xxx.js檔內
再用連結此檔案
<script type="text/javascript" src="../Scripts/xxx.js"></script>
的方式載入頁面
我安裝後用Google Analytics檢查,它卻說"我們無法驗證您的網站:未安裝追蹤"
我看這個官方的說明,好像沒說到可以用src=""的方式引用js
http://www.google.com/support/analytics/bin/answer.py?hl=zh_TW&answer=174090&utm_id=ad
不過如不用引用的方式,將來不是不易於維護嗎?如以後ga又換了代碼了,豈不是要每一頁都換

謝謝


 回复 引用 查看   
#42楼[楼主] 2010-08-27 08:39 | BearRui(AK-47)      
@ezcallme
按道理应该是可以,不过我没试过,不知道是不是ga又做特别处理。

其实不需要加外部的js才好维护,只需要把ga的代码写到1个公用的文件(比如jsp,aspx),然后再其他页面都inculde这个页面就可以了,这样以后修改也只修改1个地方就可以。

 回复 引用   
#43楼 2010-08-27 11:09 | ezcallme[未注册用户]
inculde的方法是有想過
但考慮到有的頁面如只是為.html頁面
就無法用inculde了

官方是有寫出
For any PHP pages, put the following code in a file (for example, analyticstracking.php) and upload it to your site. Then, add the following line to each template page immediately after the opening <body> tag: <?php include_once("analyticstracking.php") ?>

不知是否有其他方法?
謝謝博主

 回复 引用 查看   
#44楼[楼主] 2010-08-27 12:31 | BearRui(AK-47)      
@ezcallme
HTML中可以使用JS的include,可以参考我这篇文章的实现:
http://www.cnblogs.com/BearsTaR/archive/2010/08/05/js_include.html

 回复 引用   
#45楼 2010-08-27 14:12 | ezcallme[未注册用户]
謝謝博主
剛剛有找到這則資訊
但似乎也沒有最好的解決方案
要重新在頁面載入2個.js檔
就必須動到原來已上線的頁面
http://www.google.com/support/forum/p/Google+Analytics/thread?tid=09db22d528c94253&hl=en

看來也只能期待ga能夠更新一下方式了

 回复 引用 查看   
#46楼[楼主] 2010-08-27 22:03 | BearRui(AK-47)      
@ezcallme
不好意思,今天一直忙,都没时间回复。

我想了下,其实用js的include的方法也不行,因为用js的include最终也是加载了外连接的js,应该也会报错。其实ga修改的问题不用太担心,如果ga改了代码,肯定会支持以前的代码的。

 回复 引用   
#47楼 2010-08-28 16:33 | ezcallme[未注册用户]
謝謝博主
刷新评论列表  刷新页面  返回页首
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

验证码: 验证码 看不清,换一个

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1733679 1E7l4Ox3IQg=
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 苹果员工称下一代iPad显示效果“令人惊叹”
· 海盗湾:2012是风暴之年
· 苹果市值超微软Google之和 超瑞典GDP
· LinkedIn四季度净利690万美元 同比增长30%
· 微软高管详解ARM版Win 8:提供Office 15
» 更多新闻...
最新知识库文章:
· 如何学习一门新的编程语言?
· 学习不同编程语言的重要性
· 为什么我喜欢富于表达性的编程语言
· 计算机专业的女生为什么要学编程
· 前端必读:浏览器内部工作原理
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务

抓虾
google reader
鲜果
哪吒
QQ邮箱
http://wap.feedsky.com/BearRui
昵称:BearRui(AK-47)
园龄:5年10个月
荣誉:推荐博客
粉丝:124
关注:3

搜索

 

最新随笔

  • 1. 产生唯一随机码的方法分析。
  • 2. URL中允许携带sessionid带来的安全隐患。
  • 3. JS 实现完美include
  • 4. 基于模板的excel导出
  • 5. 实现if elseif else的jsp标签。
  • 6. 记一复杂页面的前端优化(2) - 其他优化
  • 7. 记一复杂页面的前端优化(1) - 不一样的延迟加载
  • 8. 名站技术分析 — tudou网首页下列菜单的弹出效果
  • 9. LESS 让css也支持变量,运算符,include,嵌套规则等等
  • 10. CSS技巧 — 不使用图片实现圆角、阴影、渐变等功能

随笔分类(38)

  • .NET(11)
  • CSS(3)
  • JAVA(2)
  • javascript(4)
  • Life(5)
  • WEB(4)
  • 高性能WEB开发(5)
  • 浏览器(1)
  • 名站技术分析(3)

随笔档案(39)

  • 2010年10月 (1)
  • 2010年8月 (3)
  • 2010年7月 (5)
  • 2010年6月 (4)
  • 2010年5月 (6)
  • 2006年6月 (4)
  • 2006年5月 (7)
  • 2006年4月 (9)

积分与排名

  • 积分 - 178236
  • 排名 - 485

最新评论

阅读排行榜

评论排行榜

推荐排行榜

Copyright ©2012 BearRui(AK-47)