单击表单提交后在谷歌分析中跟踪事件

IT技术 javascript jquery google-analytics analytics
2021-02-02 22:30:50

当有人填写表单并点击提交时,我需要在谷歌分析中跟踪一个事件。出现的结果页面是一个标准的仪表板类型页面,因此为了跟踪该页面上的事件,我必须在 url 中传递事件,然后读取 url 并输出谷歌分析事件跟踪 javascript 代码基于它。这是一个经常添加书签的页面,并且页面会重新加载、点击返回等。所以我真的不想在 URL 中传递跟踪事件并搞砸分析。

相反,我更愿意使用表单在页面上执行类似以下 jQuery 代码的操作:

$('#form_id').submit(function() {
  _gaq.push('_trackEvent', 'my category', 'my action');
});

我担心上面的问题是我会错过一些正在跟踪的事件,因为在调用该 javascript 之后,浏览器将立即提交表单并转到另一个网页。如果 utm.gif 跟踪图像没有及时加载,我会错过这个事件:(。

我的恐惧有道理吗?如何确保我不会错过正在跟踪的事件?

6个回答

使用谷歌分析hitCallback

您可以在跟踪器对象上指定自定义回调函数。

_gaq.push(['_set', 'hitCallback', function(){}]);

在“命中发送成功”后调用回调。

如果您想跟踪提交按钮上的点击并在之后发送表单,您可以为您的事件使用以下代码(使用 jQuery):

var _this = this; // The form input element that was just clicked
_gaq.push(['_set','hitCallback',function() {
    $(_this).parents('form').first().submit(); // Submit underlying form
}]);
_gaq.push(['_trackEvent', 'My category', 'My action']);
return !window._gat; // Ensure that the event is bubbled if GA is not loaded

或者作为onclick<input type="submit">元素的一个衬垫

onclick="var _this=this;_gaq.push(['_set','hitCallback',function(){$(_this).parents('form').first().submit();}]);_gaq.push(['_trackEvent','My category','My action']);return !window._gat;"

它做了什么,它跟踪事件My category/My action,使用 jQuery 查找刚刚按下的提交按钮的底层表单元素,然后提交整个表单。

请参阅:Google Analytics - 将数据发送到 Google Analytics - 点击回调(感谢 supervacuo)

更新 如果你使用定义了 ga() 函数的现代 analytics.js 代码,你可以这样写:

var _this = this;
ga('send', 'event', 'My category', 'My action', {
    'hitCallback': function() {
        $(_this).parents('form').first().submit();
    }
});

return !window.ga;
@AnandS 这可能是因为您无法从 google 获得响应......这意味着永远不会调用回调。
2021-03-13 22:30:50
google-analytics.js 被屏蔽的情况如何?ga 仍然定义但回调不起作用。我在下面添加了案例(谷歌分析通用答案)。如果你能更新你的答案会很棒(这会节省其他人的时间)。无论如何,感谢您的回答!
2021-03-27 22:30:50
这工作得很好,直到没有活动的互联网连接(例如,在没有互联网的办公室局域网中工作)。一旦互联网断开连接,回调事件不会触发!
2021-03-30 22:30:50
@DmytroPastovenskyi 这是每个人在查看此答案时都应注意的关键点。
2021-03-30 22:30:50
这很好用,但是我发现我需要在使用 _gaq.push(['_set', 'hitCallback', null]); 触发后清除回调;否则,如果用户点击“后退”按钮,然后在页面上执行其他一些导致另一个 _gaq.push 的操作,回调将再次触发我必须在 Android 上执行此操作以防止回调多次错误触发。
2021-04-07 22:30:50

只有两种方法可以 100% 确保所有表单提交(在启用了 JS 且未阻止 GA 的用户中)如下:

  • 您可以执行 AJAX 提交,然后不必担心页面更改,从而有时间让 GA 处理并加载新页面以代替旧页面。
  • 您可以强制表单在新窗口中打开其操作,从而使主页上的所有后台进程保持工作状态,并防止出现您担心的竞争情况。

这样做的原因是 Google Analytics 没有回调函数,因此您永远无法确定是否捕获了所有提交,即使您设置了 10 秒的延迟。

或者,您可以将 GET 值传递给提交的页面并在该页面上设置该值的检查。如果设置,您可以发送 trackEvent 调用。

对于这个问题,未来的Google,谷歌Analytics(分析)确实现在有一个回调函数。只需在最后一个参数处传递一个对象,并带有hitCallback一个函数属性。
2021-03-24 22:30:50
@yc 谢谢,现在我明白你的意思了。嗯.. 该网站在很大程度上依赖于链接、点击后退按钮和其他让我非常意识到每个视图和操作都有一个单独网页的事情。但是,我想我们可以将 URL 更改为类似 /current_form_page#redirect=new_page 的内容。任何 ajax 提交只会用新页面替换整个 <body> 并相应地设置 url。直接转到该网址或重新加载会导致重定向到指定页面。不确定会出现什么问题,但我会给你公认的答案。
2021-04-08 22:30:50
@at 从技术上讲,它是同一个页面,只是使用 JavaScript 动态加载新内容,具体取决于结果,使其“感觉”像最终用户的新页面。但是,由于在 ga.js 构建 __utm.gif 请求之前页面不会离开,因此不会有中断的机会,因此这将提供关于正在发生的提交数量的更准确的视图。
2021-04-09 22:30:50
新窗口不是一种选择。但是,AJAX 方法有什么帮助呢?在加载谷歌分析图像时,我如何能够打开新页面而不是旧页面?
2021-04-10 22:30:50

对于那些处理 google 分析通用并使用 hitCallback 做一些技巧的人(验证后但提交表单之前的 fx 跟踪事件)请记住,google-analytics.js 可能会被阻止,但仍会定义 ga 函数,因此提交不会发生。

ga('send', 'pageview', event, {
  'hitCallback': function() {
    _this.submit();
  }
})
return !window.ga;

可以通过检查 ga 是否加载的验证来修复

ga('send', 'pageview', event, {
  'hitCallback': function() {
    _this.submit();
   }
})
return !(ga.hasOwnProperty('loaded') && ga.loaded === true)
这段代码应该包装在一个函数中吗?我不明白return挂在那里声明。我错过了什么?谢谢。
2021-03-28 22:30:50

这个问题已经有几年的历史了,似乎谷歌分析已经提供了一种无需上面给出的技巧就可以做到这一点的方法。

来自谷歌分析文档

除了命令数组,您还可以将函数对象推送到 _gaq 队列。这些函数可以包含任意的 JavaScript 和命令数组,它们按照被推送到 _gaq 的顺序执行。

您可以将其与多命令推送相结合,以确保它们按顺序添加(并保存调用)。

$('input[type="submit"]').click(function(e) {
    // Prevent the form being submitted just yet
    e.preventDefault();

    // Keep a reference to this dom element for the callback
    var _this = this;

    _gaq.push(
        // Queue the tracking event
        ['_trackEvent', 'Your event', 'Your action'],
        // Queue the callback function immediately after.
        // This will execute in order.
        function() {
            // Submit the parent form
            $(_this).parents('form').submit();
        }
    );
});
经进一步研究,有一个从这个SO答案似乎不确定性来结束一些见解:stackoverflow.com/questions/3427580/...不管 GA 脚本实际上是如何做到的,在该页面上还有一些其他值得一看的建议。
2021-03-12 22:30:50
另一个类似的答案说它不是: stackoverflow.com/a/8147110/1123438
2021-03-16 22:30:50
那行得通吗?看起来它会首先跟踪加载 utm.gif 图像的事件。然后它将提交表单,但在 utm.gif 加载之前,表单仍然有同样的机会将您带到另一个页面(但是它需要部分加载以注册事件)。
2021-04-04 22:30:50
另一个注意事项:ga 调试器确实在页面离开之前将其报告为成功。
2021-04-04 22:30:50
此代码不起作用,因为函数将立即执行而无需等待事件被跟踪
2021-04-07 22:30:50

如果您不太担心 100% 的准确度,您可以延迟 1 秒。

$('#form_id').submit(function(e) {
  var form = this;
  e.preventDefault(); // disable the default submit action

  _gaq.push('_trackEvent', 'my category', 'my action');

  $(':input', this).attr('disabled', true); // disable all elements in the form, to avoid multiple clicks

  setTimeout(function() { // after 1 second, submit the form
    form.submit();
  }, 1000);
});
@at 仔细想想,即使 HTTP 请求没有完成,这也几乎是 100% 准确的。关键事件是请求被谷歌服务器接收——HTTP请求的完成仅用于客户端反馈。1 秒将为您提供非常接近 100 的准确度。
2021-03-27 22:30:50
@yc 有趣——我对 GA 不是特别熟悉,当然也不熟悉它的这一部分。我不太明白这将如何改变关于准确性的观点——当然几乎没有浏览器会花一秒钟来生成 HTTP 请求。
2021-03-27 22:30:50
@lonesomday 啊。你是对的,但不是 100% 的准确度。延迟与生成HTTP 请求有关。GA 不会立即执行此操作。它首先必须在 JavaScript 中生成请求。它通常很快,但同样,在边缘浏览器上是不可预测的。
2021-04-06 22:30:50
@yc 不,因为那是 DOM 元素的提交操作,而不是 jQuery 对象的,所以它不会调用 jQuery 处理程序。
2021-04-09 22:30:50
@lonesomeday 这不会造成无限循环吗?最后调用 formsubmit() 不是只是一次又一次地调用这个函数吗?
2021-04-11 22:30:50