我正在使用Google Analytics(analytics.js)来监控网站。如果任何脚本无法执行,我希望能够报告异常。
因此,例如,如果某个应用程序有一个.js文件,如果该文件包含拼写错误,我希望能够报告该GA的例外情况。所以,我不能把“创建”调用放在我的JS中,我必须先把它放进去。
通过在HEAD中执行,我找到了一种可以90%的时间工作的方式:
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date(); a = s.createElement(o),
m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m);
// MY CODE
i[r]('create', 'UA-XXXXXX-Y', 'auto');
i.addEventListener('error', function (e) {
i[r]('send', 'exception', {
'exDescription': "'" + e.message + "': '" + e.filename + "' at line " + e.lineno,
'exFatal': true
});
});
// END MY CODE
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
当我的应用程序加载报告两个内容时,“页面浏览”和“定时”之后(总是发生在“页面浏览”之后),但大约40%的时间,只有第一个报告给GA服务器。尽管无论如何都要调用“window.ga”,并且控制台上没有错误,我看到HTTP请求缺少“计时”。但是只有30-40%的时间才会发生。
它看起来像竞争条件,所以我尝试通过将代码分成三个块来同步加载脚本。第一个块进入队列,第二个块同步获取文件,第三个块初始化跟踪器:
<script>
((function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date()
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
</script>
<script src="//www.google-analytics.com/analytics.js"></script>
<script>
window.ga('create', 'UA-XXXXXX-Y', 'auto');
window.addEventListener('error', function (e) {
window.ga('send', 'exception', {
'exDescription': "'" + e.message + "': '" + e.filename + "' at line " + e.lineno,
'exFatal': true
});
});
</script>
它每次都有效。但是,如果我再次将脚本设置为async
:
<script src="//www.google-analytics.com/analytics.js" async></script>
然后在40%的时间里它再次错过了计时事件。
为什么会这样?
哪种方法可以实现我最初的报告脚本解析异常的想法?