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

Dav*_*och 16 javascript cookies google-analytics monkeypatching httpcookie

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


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

现在,显然Google Analytics会对其值进行读取,写入和操作,并且需要将其用于GA跟踪脚本.

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

  • 写完__utm*后将cookie 重写到本地存储ga.js
  • ga.js运行后删除它们
  • ga.js读取之前,将cookie从本地存储重写回cookie表单
  • 重来

或者,猴子补丁ga.js在开始cookie读/写部分之前使用本地存储.

显然,如果我们想要删除__utm*cookie 那么远,我们也希望使用Async的分析变体.

我猜这次投票是因为我没有问一个问题.DOH!

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


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

Elm*_*mer 18

用这个:

(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');
Run Code Online (Sandbox Code Playgroud)

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

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

另外,看看这个插件:http://plnkr.co/MwH6xwGK00u3CFOTzepK

  • 很好.对于大多数情况,您首先要对localStorage进行功能测试(可能使用Modernizr,如果不存在则回退到cookie存储. (2认同)
  • **这可能违反GA TOS!**以下是GA团队成员的二手引用,取自[本文](http://goo.gl/sVnWBQ):*"使用HTTP状态管理机制"(阅读: localStorage)"传播cookie状态是对我们隐私保护措施的规避.这样做违反了Google Analytics服务条款".*我对此的解释是GA使用cookie而不是localStorage,因为更多用户熟悉cookie的概念和如何清除它们; 因此,GA使用cookies是一种隐私功能. (2认同)
  • @smhmic现在谷歌正式支持!请参阅:https://github.com/h5bp/html5-boilerplate/issues/1444#issuecomment-213000510 (2认同)