16

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


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

现在,显然 Google Analytics 会读取、写入并根据它们的值进行操作,并且它们需要可用于 GA 跟踪脚本。

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

  • 写入后将 cookie重写__utm*到本地存储ga.js
  • ga.js运行后删除它们
  • ga.js在读取它们之前将 cookie 从本地存储重写回 cookie 形式
  • 重来

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

显然,如果我们要移除__utm*cookie,我们还需要使用 Analytics 的异步变体。

我猜投反对票是因为我没有问问题。哦!

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


我有一个默认的HTML/CSS/JS样板模板,它以接近完美的分数通过了 YSlow、PageSpeed 和 Chrome 的审核。我真的在寻找一种方法来在支持本地存储的浏览器中从 Google Analytics 中压缩剩余的 cookie 字节。

4

3 回答 3

20

用这个:

(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 会为我们生成一个新的。在跟踪器加载后,我们将新的(或现有的)客户端 ID 保存在 localStorage 中。

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

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

于 2013-10-06T08:45:47.810 回答
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?

于 2012-05-16T10:03:47.323 回答
0

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

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

如果您的第二种方法有效...不确定。我不知道ga.js代码是否足够好,无法估计这是否容易实现。

还有第三种选择,运行您自己的ga.js. 您不需要使用 Google 版本。

可以按照上面说的来做吗? 是的

为什么还没有完成?

  1. cookie 很小,如果您对所有静态内容使用无 cookie 域,则没有太多好处
  2. 它不太方便,因为很多浏览器还不支持它
于 2010-12-27T14:46:24.190 回答