我们有一个自定义Google Analytics插件,可以发送命令来跟踪自定义综合浏览量和日志事件。这是我们场景的简化版本:
// Version 1: only works with analytics.js, not with GTM
function GaPlugin(tracker, config) {
// Simplified for SO, we actually use the config argument
// to track more interesting pages and events...
ga(tracker.get('name') + ".send", "pageview", "/virtual/page/view");
}
var ga = window[window["GoogleAnalyticsObject"] || "ga"];
if (typeof ga == "function") {
ga("provide", "myAnalytics", GaPlugin);
ga("require", "myAnalytics", { /* omitted for simplicity */ });
}
如果页面上直接包含analytics.js
,则此工作正常。但是,我们现在使用Google跟踪代码管理器在页面上包含通用分析。因此,我们遇到了可怕的错误......
命令被忽略。未知目标:未定义
...正在执行require
命令时在Google Analytics调试Chrome插件中看到。
This question和this blogpost表示需要设置跟踪器名称(在GTM中,使用:编辑标签=>更多设置=>高级配置=>设置跟踪器名称复选框)但是工具提示说“在GTM 中非常不鼓励使用命名跟踪器”。所以我改变了这一点:
// Version 2: crashes with GTM because ga is loaded after this code
function GaPlugin(tracker, config) {
// Simplified for SO, we actually use the config argument
// to track more interesting pages and events...
ga(tracker.get('name') + ".send", "pageview", "/virtual/page/view");
}
var ga = window[window["GoogleAnalyticsObject"] || "ga"];
if (typeof ga == "function") {
ga("provide", "myAnalytics", GaPlugin);
ga(ga.getAll()[0].get("name") + ".require", "myAnalytics", { });
}
但是现在我遇到了一个错误,因为ga
在执行上述操作时undefined
,因为GTM将异步加载通用分析,我想运行我的代码来立即引导插件。这也意味着我无法在ga
命令队列上放置回调,因为它再次出现:它还不存在。
从本质上讲,事物的顺序(我认为)现在是:
我能想到的唯一解决方法是:
// Version 3: ugly workaround...
function GaPlugin(tracker, config) {
// Simplified for SO, we actually use the config argument
// to track more interesting pages and events...
ga(tracker.get('name') + ".send", "pageview", "/virtual/page/view");
}
var interval = setInterval(function() {
var ga = window[window["GoogleAnalyticsObject"] || "ga"];
if (typeof ga == "function" && typeof ga.getAll == "function") {
ga("provide", "myAnalytics", GaPlugin);
ga(ga.getAll()[0].get("name") + ".require", "myAnalytics", { });
clearInterval(interval);
}
}, 250);
有没有更好的方法呢? GTM文档或GA插件文档似乎都有相关信息。
作为一个脚注,我刚刚意识到,如果我通过自己创建ga
作为命令队列模仿the tracking snippet,它也可能有用。但这也是一种解决方法,而不是解决方案......
答案 0 :(得分:0)
不满意,但让我分享我的解决方案作为答案,因为它实际上是我现在正在使用的解决方案。它建立在最后一个脚注的基础上:模仿Google Analytics引导代码片段的作用。
我正在设置ga
对象,或者至少设置q
属性:
function createGoogleAnalyticsQueueIfNeeded() {
// As a workaround for: http://stackoverflow.com/questions/40587544
// We mimick: https://developers.google.com/analytics/devguides/collection/analyticsjs/tracking-snippet-reference
var gaKey = window["GoogleAnalyticsObject"] || "ga";
var ga = window[gaKey] || function () {
(window[gaKey]["q"] = window[gaKey]["q"] || []).push(arguments);
};
window[gaKey] = ga;
return ga;
}
调用上述内容后,您可以在该队列上放置一个命令,该命令将在GTM完成加载GA时执行(其中还包括运行所有跟踪器的插件的优化):
var ga = createGoogleAnalyticsQueueIfNeeded();
ga(function() {
ga("provide", "myAnalytics", GaPlugin);
ga.getAll().forEach(function(t) {
ga(t.get("name") + ".require", "myAnalytics", { });
});
});
此外,provide
和.require
调用现在在回调时通过GA(通过GTM加载)holler运行。