有谁知道为什么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>
答案 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位)。
不一定为什么他们会以这种方式分解它,但它会使我们的目的更容易。