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

Cra*_*lot 15 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>
Run Code Online (Sandbox Code Playgroud)

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

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

And*_*ore 18

<script>标签按顺序执行.一<script>,如果不这样做的前一个执行块不能执行.

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

<script></script> <!-- First Script Tag -->
<script></script> <!-- Google Injected Script -->
<script></script> <!-- Second Script Tag -->
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*rry 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>
Run Code Online (Sandbox Code Playgroud)

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

那有意义吗?