15

有谁知道为什么 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>
4

5 回答 5

18

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

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

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

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

于 2009-07-31T00:39:54.333 回答
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();代码会失败,因为_gat在加载 ga.js 文件之前不会定义。

那有意义吗?

于 2009-07-31T00:23:32.783 回答
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

于 2009-07-31T00:22:52.300 回答
0

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

于 2009-07-31T00:08:22.163 回答
0

值得一提的是,我们大量使用 onclick="pageTracker._trackPageview(%filename%)" 机制来跟踪直接文件下载,但在页面完全加载之前仍不想跟踪实际的综合浏览量。我们必须在页面顶部包含第一个标签才能启用它,但在最后保留最终的 _trackPageview() 调用(好吧,我们也使用 var pageTracker 位)。

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

于 2009-07-31T00:21:55.137 回答