【发布时间】:2014-11-12 05:27:03
【问题描述】:
我正在使用Angular.js 构建SPA。我们使用Google Tag Manager 加载我们的大部分分析/营销脚本,其中包括谷歌分析。我还使用ui-router 来管理状态/视图。
每当用户在我的应用中浏览到不同的 state 时,我想将 pageview 事件发送到 Google Analytics。使用 GTM 执行此操作的部分复杂性在于 GTM 创建了一个named tracker。这意味着所有 GA 事件都需要在前面加上跟踪器名称。这通常看起来像这样:
ga('trackerName.send', 'pageview', {page: '/a/path/', title: 'A Title'});
GTM 使用随机生成的跟踪器名称,因此需要在运行时抓取跟踪器名称。这可以通过 GA 的 getAll 函数相当简单地完成。如果您想将 pageview 事件发送给所有跟踪器,您只需执行以下操作:
var allTrackers = ga.getAll();
for(var i=0; i<allTrackers.length; i++) {
ga.send(allTrackers[i].getName()+".send", "pageview", {page: '/a/path', title: 'A Title'});
}
这对我的大多数浏览量事件非常有用。但是,在 ui-router 触发初始视图的 $stateChangeSuccess(这是我触发 GA 页面浏览的地方)与加载 analytics.js 之间存在竞争条件。
在加载 analytics.js 之前,Google Analytic 的 sn-p 创建一个虚假的 ga 对象,您可以将事件发送到该对象。这个人造对象没有其他的 ga 函数,所以你不能运行getAll。如果没有getAll 函数,我无法获取跟踪器名称,也无法发送浏览量事件。
据我所知,Google Analytics(分析)不提供任何回调或事件来说明 analytics.js 何时完成加载,因此无法确定何时可以开始发送事件。现在我正在使用$interval 来检查ga.getAll 的存在,但这不是一个非常高效或理想的解决方案。这就是我所拥有的:
gaCheckInterval = setInterval(function() {
if(typeof(ga) !== 'undefined' && typeof(ga.getAll) == 'function') {
clearInterval(gaCheckInterval);
sendBackloggedEvents();
}
}, 200);
还有其他方法可以识别 analytics.js 何时完成加载吗?或者以任何其他方式将事件发送到命名跟踪器,而无需访问getAll?
【问题讨论】:
标签: angularjs google-analytics single-page-application google-tag-manager