2010-05-13 41 views
2

这是比什么都好奇的问题...双script标签跟踪代码

谷歌指示添加Analytics跟踪代码如下:

<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-xxxxxx-x"); 
     pageTracker._trackPageview(); 
    } catch(err) {} 
</script> 

我想知道一些JS大师在这里可以告诉我为什么他们将它分成两个脚本标记,而不是将它们全部粘在一个脚本标记中。我知道最上面的部分可以放在标题和body标签前面的底部,以确保页面在跟踪之前加载,但是我想知道是否还有更多。任何知道如何将代码分解成两个标签的人都会知道。

我只要求,因为这是从goog到来,正在使用的数百万个网站......

感谢

+1

只是通过评论。以异步方式加载Google Analytics有一个很酷的代码片段:http://code.google.com/apis/analytics/docs/tracking/asyncTracking.html – juandopazo 2010-05-14 00:41:07

+0

不错,不知道他们有这个,谢谢 – Tom 2010-05-14 01:56:23

回答

3

这是要一致的跨浏览器,它需要确保document.write()坚持它的下一个脚本块运行之前生成的标签,所以结果看起来是这样的:

<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script> 
<script type="text/javascript"> 
    try{ 
     var pageTracker = _gat._getTracker("UA-xxxxxx-x"); 
     pageTracker._trackPageview(); 
    } catch(err) {} 
</script> 

如果没不会在2个脚本中执行,_gat在第二个脚本块中未定义,因为ga.js尚未加载...但是作为之前的脚本块那一个,页面在最后一个块内执行代码之前等待,当它应该时,所有这些都可以工作。基本上,浏览器以的顺序执行脚本块,谷歌利用这个事实加载脚本,当它需要被加载...这是在它被使用之前。

+0

啊,有道理......一旦延迟消失,我会接受这个答案。谢谢。 – Tom 2010-05-14 00:04:59

1

如果我猜的话,我会说这是因为document.write(unescape(...));的行他们动态地包括另一个JS文件。为什么他们动态加载那个我不知道。我想这与您是否运行https或http有关。

如果是一个文件,我怀疑ga.js文件将被加载以及时运行pageTracker代码。 _gat将不存在,并且您会收到错误,而不是实际使用Google Analytics。

+0

有趣的想法..但是标签的关闭和重新打开是否足以让情况变得如此呢? – Tom 2010-05-14 00:02:44