我正在使用SPA构建Angular.js。我们使用Google Tag Manager加载我们的大多数分析/营销脚本,其中包括Google Analytics。我还使用ui-router来管理状态/视图。
每当用户浏览我的应用中的其他state时,我都希望将pageview
个事件发送给Google Analytics。使用GTM执行此操作的部分复杂性是GTM创建了named tracker。这意味着所有GA事件都需要添加跟踪器名称。通常看起来像这样:
ga('trackerName.send', 'pageview', {page: '/a/path/', title: 'A Title'});
GTM使用随机生成的跟踪器名称,因此需要在运行时抓取跟踪器名称。这可以通过GA getAll
函数相当简单地完成。如果您想将网页浏览事件发送给所有跟踪器,您只需执行以下操作:
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的代码段会创建一个可以发送事件的虚假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
?
答案 0 :(得分:3)
尝试配置和触发单个跟踪器会绕过使用标记管理器的目的。而是做:
dataLayer.push({event:'spa.pageView', page:..., title:...});
其中:
dataLayer
可选地在gtm片段中重命名
spa
是您的app / project / company /的便捷缩写,以防您以后需要区分其操作。
page
和title
可以是您喜欢的任何内容,您可以通过在GTM容器中添加dataLayer宏来引用它们。
然后,在标签管理器中配置:
rule
{{event}} ends with pageView
。dataLayer macros
代表page
,title
您正在推进dataLayer。UA Tag
(以及其他任何其他)要触发(1)并使用(2)中的宏来覆盖它们的TAG参数。现在,您可以配置细节并添加其他重用规则和宏的标记类型,而无需为每次更改修改应用程序。