谷歌的
传统指南中关于如何包含
ga.js
的说明使用了
document.write()
。因此,即使浏览器以某种方式异步加载外部JavaScript库直到某些代码实际执行,
document.write()
仍然会阻止页面加载。后来的
异步指南没有直接使用
document.write()
,但是
insertBefore
也可能会阻止页面加载?
然而,Google将缓存的
max-age
设置为
86400秒(即1天,并且设置为
公共,因此也适用于代理)。因此,由于许多站点加载完全相同的Google脚本,JavaScript通常会从缓存中获取。尽管如此,
即使ga.js
被缓存,仅单击重新加载按钮通常也会使浏览器向Google询问任何更改。然后,就像当
ga.js
尚未被缓存时一样,浏览器必须等待响应才能继续:
GET /ga.js HTTP/1.1
Host: www.google-analytics.com
...
If-Modified-Since: Mon, 22 Jun 2009 20:00:33 GMT
Cache-Control: max-age=0
HTTP/1.x 304 Not Modified
Last-Modified: Mon, 22 Jun 2009 20:00:33 GMT
Date: Sun, 26 Jul 2009 12:08:27 GMT
Cache-Control: max-age=604800, public
Server: Golfe
请注意,许多用户会为他们已经在浏览器窗口中打开的新闻网站、论坛和博客点击重新加载,这会导致许多浏览器阻塞,直到从Google收到响应。你有多频繁地重新加载SO首页?当Google Analytics响应缓慢时,这些用户会立刻注意到。(网络上发布了
许多解决方案来异步加载ga.js脚本,对于这些类型的网站特别有用,但可能不再比Google的更新指令更好。)
一旦JavaScript加载并执行完毕,跟踪图像(追踪图片)的实际加载应该是异步的。因此,
跟踪图像的加载不应该阻塞任何其他内容,除非页面使用body.onload()
。在这种情况下,如果Web bug无法及时加载,那么单击重新加载实际上会使情况变得更糟,因为单击重新加载还会使浏览器请求再次脚本,其中包括上述的
If-Modified-Since
。在重新加载之前,浏览器只等待Web bug,而在单击重新加载之后,它还需要
ga.js
脚本的响应。
因此,使用Google Analytics的网站不应该使用body.onload()
。相反,应该使用类似于jQuery的$(document).ready()或MooTools的domready事件。
另请参见Google的功能概述,解释了“Google Analytics如何收集数据?”,包括“跟踪代码的工作原理”。(这也正式说明Google收集第一方cookie的内容。也就是你正在访问的网站的cookie。)
更新:
在2009年12月,Google发布了
一个异步版本。上述内容应该告诉每个人升级以确保安全,但是
升级并不能解决所有问题。