Google analytics 竞争条件和同步使用Google Analytics Asynchronous(_gaq)

Google analytics 竞争条件和同步使用Google Analytics Asynchronous(_gaq),google-analytics,analytics,race-condition,Google Analytics,Analytics,Race Condition,我有一个网站正在使用谷歌分析(Google Analytics)更新的异步跟踪方法(_gaq)。我遇到的问题是,我想建立一些特定的链接跟踪,并担心我会创造一个比赛条件 基本上,这是一个新闻网站,所以它有标题链接到各地的故事。一个故事的标题可能出现在一页的3个不同位置,并出现在数百页其他页面上。因此,为了了解我们的受众是如何与网站互动的,我们必须跟踪每个特定标题块是如何使用的,而不仅仅是目的地。由于这两个规定跟踪个别网页,也不跟踪参考网页将是不够的,我们必须跟踪个别链接 如果我有一个链接 <

我有一个网站正在使用谷歌分析(Google Analytics)更新的异步跟踪方法(_gaq)。我遇到的问题是,我想建立一些特定的链接跟踪,并担心我会创造一个比赛条件

基本上,这是一个新闻网站,所以它有标题链接到各地的故事。一个故事的标题可能出现在一页的3个不同位置,并出现在数百页其他页面上。因此,为了了解我们的受众是如何与网站互动的,我们必须跟踪每个特定标题块是如何使用的,而不仅仅是目的地。由于这两个规定跟踪个别网页,也不跟踪参考网页将是不够的,我们必须跟踪个别链接

如果我有一个链接

<a href="http://www.blah.com" onclick="_gaq.push('_trackEvent','stuff')">Here</a>


因为_gaq.push()是一个异步调用,所以页面更改不可能在Google完成点击跟踪之前发生吗?如果是这样的话,有没有办法防止这种情况发生,或者我对Google Analytics异步功能()的方式有误解。

你说得对。如果浏览器在发送事件的GA跟踪信标(gif hit)之前离开页面,则不会记录事件。然而,这对于异步代码来说并不新鲜,因为发送跟踪信标的过程是异步的;在这方面,旧代码的工作方式是相同的。如果跟踪真的那么重要,您可以这样做:

function track(link) {
  if (!_gat) return true;
  _gaq.push(['_trackEvent', 'stuff']);
  setTimeout(function() {location.href=link.href'}, 200);
  return false;
}

...

<a href="example.com" onclick="return track(this);"></a>
功能轨迹(链接){
如果(!\u gat)返回true;
_gaq.push([''u trackEvent','stuff']);
setTimeout(函数(){location.href=link.href'},200);
返回false;
}
...

如果GA已经加载,那么当点击链接时,这将阻止浏览器进入下一页(最好不要让用户等待那么长时间)。然后它发送事件并等待200毫秒将用户发送到他们单击的链接的href。这增加了事件被记录的可能性。通过延长超时时间,您可以进一步提高这种可能性,但这也可能会损害过程中的用户体验。这是一种你必须尝试的平衡

我也遇到了这个问题,决心找到一个真正的解决办法

把函数推到队列中怎么样

  // Log a pageview to GA for a conversion
  _gaq.push(['_trackPageview', url]);
  // Push the redirect to make sure it happens AFTER we track the pageview
  _gaq.push(function() { document.location = url; });

我正在尝试一种新的方法,我们自己为utm.gif构建URL,并请求它,然后只有在收到响应(gif)后,我们才会将其发送给用户:

用法:

  trackPageview(url, function() { document.location = url; });
代码(crumplecookie from:)

/**
*使用此功能将页面浏览记录到google,并确保其通过
*见:http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=5f11a529100f1d47&hl=en 
*/
函数trackPageview(url,fn){
var-utmaCookie=crumplecookie(“uuu-utma”);
var utmzCookie=crumplecookie(“uuuuutmz”);
var cookies='uuutma='+utmaCookie+';uuutmz='+utmzCookie;
var requestId=''+(数学地板((9999999999-999999999)*数学随机())+100000000);
var hId=“”+(数学地板((9999999999-999999999)*数学随机())+100000000);
乌特穆尔变量http://www.google-analytics.com/__utm.gif';
utmUrl+='?utmwv=4.8.9';
utmUrl+='&utmn='+requestId;
utmUrl+='&utmhn='+encodeURIComponent(window.location.hostname);
utmUrl+='&utmhid='+hId;
utmUrl+='&utmr=-';
utmUrl+='&utmp='+encodeURIComponent(url);
utmUrl+='&utmac='+encodeURIComponent(_-gaProfileId);
utmUrl+='&utmcc='+encodeURIComponent(cookies);
var image=新图像();
image.onload=函数(){fn();};
image.src=utmUrl;
}
/**
*@author:Danny Ng(http://www.dannytalk.com/read-google-analytics-cookie-script/)
*@modified:19/08/10
*@notes:免费使用和分发,无需更改此评论。如果您能给我回个链接,我将不胜感激:)
*/
//带前导和尾随空格
String.prototype.trim=function(){返回此.replace(/^\s*.\s*$/g,,);}
//检查字符串是否为空
String.prototype.empty=函数(){
如果(this.length==0)
返回true;
else if(this.length>0)
返回/^\s*$/.test(此);
}
//将cookie分解为具有密钥对cookie值的对象
函数crumbleCookie(c)
{
var cookie_array=document.cookie.split(“;”);
var keyvaluepair={};
对于(var cookie=0;cookie
使用onmousedown而不是onclick也会有所帮助。它并没有消除比赛条件,但它给了GA一个领先的开始。还有一个问题是,在松开鼠标按钮之前,有人单击链接并将其拖走,但这可能是一个可以忽略不计的情况。

在事件处理程序中,您应该设置hit回调:

_gaq.push(['_set', 'hitCallback', function(){
  document.location = ...
}]);
给你发送数据

_gaq.push(['_trackEvent'
并停止事件处理

e.preventDefault();
e.stopPropagation();
来自universal analytics(自此问题的大多数其他答案以来的新版本)。现在可以轻松地指定回调

var trackOutboundLink = function(url) {
   ga('send', 'event', 'outbound', 'click', url, {'hitCallback':
     function () {
     document.location = url;
     }
   });
}
为清晰起见,我建议使用此语法,这样可以更清楚地显示要发送的属性,并更容易添加更多:

            ga('send', 'event', {
                'eventCategory': 'Homepage',
                'eventAction': 'Video Play',
                'eventLabel': label,
                'eventValue': null,

                'hitCallback': function()
                {
                    // redirect here
                },

                'transport': 'beacon',

                'nonInteraction': (interactive || true ? 0 : 1)
            });
[这里有一个适用于所有可能的
ga
调用的示例。]

此外,我还将
传输
参数设置添加到
信标
(实际上不需要,因为它会在适当时自动设置):

这指定发送命中的传输机制。 选项有“信标”、“xhr”或“图像”。默认情况下,analytics.js 将尝试根据命中大小和大小找出最佳方法 浏览器功能。如果指定“信标”和用户的浏览器 不支持导航器.sendBeacon ga('send', 'event', { 'eventCategory': 'Homepage', 'eventAction': 'Video Play', 'eventLabel': label, 'eventValue': null, 'hitCallback': function() { // redirect here }, 'transport': 'beacon', 'nonInteraction': (interactive || true ? 0 : 1) });