Google Analytics的两个独立脚本标记?

时间:2009-07-31 00:02:30

标签: javascript google-analytics

有谁知道为什么Google Analytics需要两个单独的脚本标记?

具体来说,他们的说明建议用户将以下代码段嵌入到网页中以进行跟踪:

<!-- Google 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-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

为什么用户不能只使用一个这样的脚本块:

<!-- Google 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"));
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

5 个答案:

答案 0 :(得分:18)

<script>个标签按顺序执行。如果前一个块未执行,则<script>块无法执行。

第一个<script>代码负责创建将加载外部js的Google <script>标记。第一个<script>执行完毕后,DOM如下所示:

<script></script> <!-- First Script Tag -->
<script></script> <!-- Google Injected Script -->
<script></script> <!-- Second Script Tag -->

这可以保证在<script>完成加载之前,第二个.js标记不会执行。如果合并第一个和第二个<script>,则会导致_gat变量未定义(因为在第一个脚本执行完毕之前,Google注入的脚本不会开始加载)。

答案 1 :(得分:5)

在代码中执行

document.write后立即发生。因此,如果我们使用您的“一个脚本块”示例,实际生成的源代码最终将如下所示:

<!-- Google 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"));
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script>

因此var pageTracker = _gat._getTracker("UA-8720817-1"); pageTracker._trackPageview();代码会失败,因为在加载ga.js文件之前不会定义_gat

这有意义吗?

答案 2 :(得分:1)

第一个块实际上是使用JavaScript编写一个全新的脚本标记内联来替换该脚本标记。它正在检查您是否在所请求的页面上使用“https”,如果是,使用他们的安全URL请求脚本,或者您的浏览器可能会显示“此页面的部分是不安全的 - 显示安全项目吗?”或拒绝拨打电话。

如果第一个脚本标记包含在第一个脚本标记中,它将被吹走和/或不是一个格式良好的脚本标记,并且您的代码必须与它们混合。

通过这种方式,您可以干净利落地调用trackPageView并在您自己的块中设置属性等,并且仍可通过http和https正常工作。

因此,当页面呈现时,DOM将在第一个脚本执行后显示如下(常规http):

<!-- Google Analytics -->
<script src='http://www.google-analytics.com/ga.js' type='text/javascript'></script>

<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

这个(https):

<!-- Google Analytics -->
<script src='https://ssl.google-analytics.com/ga.js' type='text/javascript'></script>

<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-8720817-1");
pageTracker._trackPageview();
} catch(err) {}</script>

更多详情:http://code.google.com/apis/analytics/docs/tracking/gaTrackingOverview.html

答案 3 :(得分:0)

我怀疑这是为了避免使用document.write部署脚本标记来避免模糊的浏览器问题。

答案 4 :(得分:0)

为了它的价值,我们大量使用onclick =“pageTracker._trackPageview(%filename%)”机制来跟踪直接文件下载,但仍然不希望在页面完全加载之前跟踪实际的页面浏览量。我们必须在页面顶部包含第一个标记以启用它,但最后留下最后的_trackPageview()调用(好吧,我们也使用var pageTracker位)。

不一定为什么他们会以这种方式分解它,但它会使我们的目的更容易。