将Google Analytics Cookie转换为本地/会话存储

时间:2010-12-21 17:29:25

标签: javascript cookies google-analytics monkeypatching httpcookie

更新 http://jsfiddle.net/musicisair/rsKtp/embedded/result/


Google Analytics设置4个Cookie,这些Cookie将与该域的所有请求一起发送(并设置其子域)。据我所知,没有服务器实际使用它们直接;它们仅与__utm.gif一起作为查询参数发送。

现在,显然Google Analytics会对其值进行读取,写入和操作,并且需要提供给GA跟踪脚本。

所以,我想知道的是否有可能:

  • __utm*写入
  • 后,将ga.js Cookie重写为本地存储空间
  • ga.js运行
  • 后删除它们
  • ga.js读取之前将cookie从本地存储重写为cookie表单
  • 重新开始

或者, monkey patch ga.js在开始cookie读/写部分之前使用本地存储。

显然,如果我们想要删除__utm* Cookie,我们还想要使用Async的Google Analytics变体。

我猜这次投票是因为我没有提出问题。 DOH!

我的问题是:
可以如上所述完成吗? 如果是这样,为什么还没有这样做?


我有一个默认的HTML/CSS/JS样板模板,可以通过YSlow,PageSpeed和Chrome的审核获得近乎完美的分数。我真的在寻找一种方法,在支持本地存储的浏览器中从Google Analytics中挤出剩余的Cookie字节。

3 个答案:

答案 0 :(得分:17)

使用此:

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

if(window.localStorage) {
    ga('create', 'UA-98765432-1', 'www.example.com', {
      'storage': 'none'
      , 'clientId': window.localStorage.getItem('ga_clientId')
    });
    ga(function(tracker) {
      window.localStorage.setItem('ga_clientId', tracker.get('clientId'));
    });
}
else {
    ga('create', 'UA-98765432-1', 'www.example.com');
}
ga('send', 'pageview');

首先,我检查是否支持localStorage。如果支持,则'storage': 'none'选项将禁用cookie。现在我们可以从localStorage设置clientId。如果它为空,Google Analytics会为我们生成一个新的。我们在跟踪器加载后将新的(或现有的)clientid保存在localStorage中。

如果不支持localStorage,我只使用常规分析方法。初始化后,我通过ga('send', 'pageView')发送一个pageView。

另外,请查看此插件:http://plnkr.co/MwH6xwGK00u3CFOTzepK

答案 1 :(得分:2)

Chrome中的一些实验表明,可以使用getter和setter来修补document.cookie,例如:

document.__defineGetter__('cookie', function () {
    // Replace this with code to read from localstorage
    return "hello";
});
document.__defineSetter__('cookie', function (value) {
    // Replace this with code to save to localstorage
    console.log(value);
});

ga.js(或任何其他javascript)可以正常运行和访问cookie,它们永远不会传递给服务器。

显然这只适用于某些浏览器。不起作用的浏览器将不得不回归正常的cookie。

这个问题中有一些相关的想法:Is it possible to mock document.cookie in JavaScript?

答案 2 :(得分:0)

是的,可以做到。您只需要使用参数请求__utm.gif。其余数据仅用于跟踪来源,会话开始时间和/或之前的访问。

您可以轻松地双向传输Cookie,因此您的第一种方法应该可以正常工作。

如果你的第二种方法有效......不确定。我不知道ga.js代码是否足够好,可以估算哪些代码很容易实现,哪些代码不太容易实现。

还有第三个选项,运行您自己的ga.js版本。您无需使用Google版本。

可以如上所述完成吗?

为什么没有这样做?

  1. Cookie很小,如果您对所有静态内容使用无Cookie域,则没有那么多好处
  2. 因为很多浏览器还不支持它所以不太方便