谷歌分析发送事件回调函数

25

我正在尝试在用户注册后重定向之前向Google Analytics发送事件。我正在使用Google Tag Manager和通用js。

首先,我尝试使用描述在此处的dataLayer对象:developers.google

这是我的函数代码:

//Registering new user via ajax
$.ajax('/register/', {
    success: function() {

        //Pushing event to dataLayer
        dataLayer.push({
            'Category': 'Registration Process',
            'event': 'Registration Submit Btn'
        });

        //Logging in new user and redirecting the page with a timeout
        setTimeout(function(){
            loginAction();
        }, 500)
    }
})

问题在于,我只收到了大约25%的事件,所有其他事件都丢失了。我不知道在向数据层添加对象后是否实际发送到Google的事件,我认为有75%的事件根本没有发送。

现在我正在尝试实施另一种方法:

//Registering new user via ajax
$.ajax('/register/', {
    success: function() {

        //Sending event through ga('send')
        parent.ga('send', 'event', 'Registration Process', 'Registration Submit Btn');

        //Logging in new user and redirecting the page with a timeout
        setTimeout(function(){
            loginAction();
        }, 500)
    }
})

ga('send')再次没有任何回调函数!

我如何确保使用dataLayer或ga('send')实际发送了事件?


请查看:https://dev59.com/mWsz5IYBdhLWcg3wCDl2 - mdunisch
有旧的跟踪器,我正在使用通用分析,没有 _gaq 函数。 - Prosto Trader
3个回答

38

终于搞定了。这很复杂,而且文档中没有详细说明。在我的情况下,我使用Google Tag Manager,所以有一些解决方法,我必须要采取才能成功触发事件并获得回调。

首先,我们必须获取ClientId,这是发送到Google服务器的任何事件所必需的。实际上,它保存在cookie中,但Google不建议直接从cookie中获取。

这是Google推荐的获取方法,但如果您正在使用Google Tag Manager,则将不起作用

 ga(function(tracker) {
       var clientId = tracker.get('clientId');
 });

相反,您必须从getAll方法中获取ClientId。

 var clientId = ga.getAll()[0].get('clientId');

接下来,你需要创建新的追踪器。

    ga('create', 'UA-XXX-YYY', {
        'clientId': clientId
    });

之后我们可以发送一个事件:

 ga('send', 'event', {
   'eventCategory': 'YOUR Category Name', //required
   'eventAction': 'YOUR Action name', //required
   'eventLabel': 'YOUR Label',
   'eventValue': 1,
   'hitCallback': function() {
       console.log('Sent!!');
      //callback function
    },
   'hitCallbackFail' : function () {
      console.log("Unable to send Google Analytics data");
      //callback function
   }
});

1
谢谢!FYI,似乎hitCallbackFail不存在了,至少目前是这样? - Aseem Kishore
不确定 - 我们不得不转向服务器端发送,因为 JavaScript 发送不可靠且会丢失数据。 - Prosto Trader
谢谢,你救了我的一天 :) - percy
谢谢,也帮我解决了问题! - Beqa Bukhradze

6

来自Google Analytics文档 https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#hitCallback新闻

// Alerts the user when a hit is sent.
ga('send', 'pageview', {
  'hitCallback': function() {
    alert('hit sent');
  }
});

你可以编辑 hitCallback 函数以适应你自己的需求。
或者,
// Use a timeout to ensure the execution of critical application code.
ga('send', 'pageview', {'hitCallback': criticalCode});
setTimeout(criticalCode, 2000);

// Only run the critical code once.
var alreadyCalled = false;
function criticalCode() {
  if (alreadyCalled) return;
  alreadyCalled = true;

  // Run critical code here...
}

在上面的示例中,您可以定义函数(criticalCode),该函数可以确保将数据发送到Google Analytics,然后与您的代码一起使用。
要深入了解分析api,请参考以下链接: https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference

这是一段很棒的代码,可以允许自定义超时时间。永远不要假设谷歌在线 :) - Phil

2

从文档中得知:https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#hitCallback

这个链接提供了关于Google Analytics中的“hitCallback”函数的高级用法。
ga('send', 'pageview', {
  'page': '/my-new-page',
  'hitCallback': function() {
  alert('analytics.js done sending data');
}
});

在这个例子中,字段名称对象配置了页面参数和设置hitCallback。一旦跟踪器完成数据发送,将向用户显示警报框。
您可以在事件、页面浏览等方面使用hitCallback。

2
没有触发... 我猜,这是因为我正在使用Google标签管理器。 - Prosto Trader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接