拒绝之后界面显示已关闭统计,打开 Application 面板,localStorage 里 ga_client_id 这条键还在,值是一串 UUID,写入时间是半年前。乍看像缓存或者权限的锅,追下去往往不是。

Object.keys(localStorage)
  .filter(k => k.startsWith('ga_'))
  .forEach(k => localStorage.removeItem(k));

追下去是这么回事:清理逻辑只删了 cookie,没动 localStorage 和 sessionStorage,脚本下次启动读回旧编号,继续拼出同一个匿名 ID。三处存储的删除方式各不相同,漏一处就等于没删。

「同意状态清除」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

具体做法是,遍历 localStorage 里以 ga_ 开头的键逐条 removeItem,别只删一个写死的名字;sessionStorage 和 IndexedDB 里的同名库一起清,副本往往藏在那里;清理动作挂在同意回调里执行,别只在页面加载时跑一次。

验收就看一点,拒绝后刷新两次,Application 里 ga_ 前缀的键一条不剩,统计请求也不再带旧的 client_id。

作者 9823189