如何将ga命令发送到没有名称的跟踪器?

时间:2016-11-14 11:20:22

标签: javascript google-analytics google-tag-manager

我们有一个自定义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 questionthis 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命令队列上放置回调,因为它再次出现:它还不存在。

从本质上讲,事物的顺序(我认为)现在是:

  1. GTM代码段开始加载(异步)。
  2. 我自己的javascript代码运行。
  3. GTM将开始加载分析(异步)。
  4. 已加载Google Analytics并准备好使用。
  5. 我能想到的唯一解决方法是:

    // 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,它也可能有用。但这也是一种解决方法,而不是解决方案......

1 个答案:

答案 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运行。