javascript - 具有 HTML5 异步属性和协议(protocol)相关 URL 的 Google Analytics JavaScript 跟踪代码

标签 javascript html asynchronous google-analytics lazy-loading

以下是 Google 的异步分析跟踪代码:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-Y']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();
</script>


如果你问我的话,那是相当丑陋的。它可以压缩成这样(来源: Mathias ):

<script>
  var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
  (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
  g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
  s.parentNode.insertBefore(g,s)}(document,'script'));
</script>


但为什么我们不能只使用 HTML5 async 属性和 protocol-relative URL

<script src="//www.google-analytics.com/ga.js" async></script>
<script>var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];</script>

使用协议(protocol)相关 URL,我们可以避免检查 location.protocol,并且 async 属性应该负责 modern browsers 中的不显眼加载。 ,并且会在其他方面优雅地降级。

这样不是更好吗?

最佳答案

你可以这样做:

<script src="//www.google-analytics.com/ga.js" async></script>
<script>var _gaq= _gaq || [];
_gaq.push(['_setAccount','UA-XXXXX-X'],['_trackPageview']);
</script>

任何短的内容都会有覆盖 ga.js 加载的 _gaq 的风险,特别是 GA 覆盖的 _gaq.push 函数。

硬编码 script[async] 而不是使用 DOM 注入(inject)方法的问题在于,script[async] 并不是注入(inject)的唯一机制被设为异步。在旧版浏览器中,即使没有 script[async] 支持,基于 JS 的注入(inject)也可能导致异步注入(inject)。

但是,上面的代码应该可以在所有浏览器中运行,但是 ga.js 在旧版浏览器上会被阻止。节省的额外字节不值得影响性能,但如果这样做,则应该将脚本放在页脚中。

(注意:协议(protocol)相对 URL 在此有效,因为 https://www.google-analytics.com/ga.js 已由 Google 设置为有效。)

关于javascript - 具有 HTML5 异步属性和协议(protocol)相关 URL 的 Google Analytics JavaScript 跟踪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522651/

相关文章:

javascript - Onclientclick 不适用于 asp 按钮

javascript - 代码在控制台中工作,但在加载网站时不起作用

javascript - socket.io 客户端未从服务器接收消息

html - 使用预制模板的 CSS 样式。

javascript - 获取 URL 参数 elemId 并将其添加到按钮的 onClick 属性中

c# - 如何使 MvvmLight 命令异步?

javascript - 从 id 数组到名称数组(mongo、nodejs)

javascript - 如何将多个网络音频源/轨道压缩为一个?

javascript - 如何在 ng-blur 中将输入元素作为参数传递?

asp.net - ASP.Net MVC 中长时间运行 SQL 查询的最佳实践