Google Analytics的两个独立脚本标记?
-
06-07-2019 - |
题
有谁知道为什么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>
解决方案
<script>
标签按顺序执行。如果前一个块没有执行,则.js
块无法执行。
第一个_gat
标记负责创建将加载外部js的Google <=>标记。第一个<=>完成执行后,DOM如下所示:
<script></script> <!-- First Script Tag -->
<script></script> <!-- Google Injected Script -->
<script></script> <!-- Second Script Tag -->
这可以保证第二个<=>标记在<=>完成加载之前不会执行。如果第一个和第二个<=>组合在一起,这将导致<=>变量未定义(因为在第一个脚本执行完毕之前,Google注入的脚本不会开始加载)。
其他提示
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
。
这有意义吗?
第一个块实际上是使用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/的API /分析/文档/跟踪/ gaTrackingOverview.html
我怀疑这是为了避免使用document.write
部署脚本标记来避免模糊的浏览器问题。
为了它的价值,我们充分利用了onclick = <!>; pageTracker._trackPageview(%filename%)<!> quot;跟踪直接文件下载的机制,但仍然不希望在页面完全加载之前跟踪实际的页面视图。我们必须在页面顶部包含第一个标记以启用它,但最后留下最后的_trackPageview()调用(好吧,我们也使用var pageTracker位)。
不一定为什么他们会以这种方式分解它,但它会使我们的目的更容易。