前端如何处理用户同意GDPR Cookie才能加载第三方脚本?
我们网站用了 Google Analytics 和 Facebook Pixel,但欧盟用户访问时得先同意 Cookie 才能加载这些脚本。我试过用一个弹窗让用户点“同意”后再动态插入 script 标签,但不确定这样是否真的合规,而且有些脚本好像还是会提前触发。
比如我这样动态加载:
if (userConsent === 'granted') {
const script = document.createElement('script');
script.src = 'https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID';
document.head.appendChild(script);
}
但控制台还是报了 gtag 相关的错误,是不是因为我在其他地方提前调用了 gtag('config', ...)?该怎么正确实现 GDPR 合规的第三方脚本延迟加载?
JS 里面最稳妥的做法是分三步走:
1. 先别在页面里直接写 gtag('config', ...) 这种调用,改成把所有跟踪命令先缓存到一个数组里,比如叫
gtagQueue,Google 官方文档里其实也推荐这么干(叫“Command Queue”模式),这样即使脚本没加载,也不会报错。2. 用户点击“同意”后,动态插入 GA 的 script,同时把缓存的命令数组一次性注入给 gtag。
3. 脚本加载完成后,把后续的 gtag 调用直接转发到真正的 gtag 函数上,而不是继续塞队列。
具体可以这么写:
另外提醒几个坑:
- Google Analytics 4 的
gtag('config', ...)必须在脚本加载后调用,而且不能重复调用(重复会报错或合并失败),所以队列里如果有多次 config,只保留第一次。- 如果你用了 Tag Manager(GTM),那更麻烦,因为 GTM 本身会注入一堆脚本,GDPR 合规得用 GTM 的 Consent Mode,或者自己控制 consent 状态,这里就不展开说了。
- Facebook Pixel 有个细节:它会在脚本加载前自动缓存命令(用
fbq.queue),但如果你在脚本没加载时就调用了fbq('track', ...),它虽然不会报错,但可能丢失事件(因为脚本加载前调用可能没生效),所以最好也控制时机。- 本地开发时注意:浏览器缓存可能让你误以为“好像能用”,真上测试环境才暴露问题。
最后说句实话:GDPR 合规不是纯技术问题,建议你再加个 Cookie 同意管理平台(比如 Osano、Usercentrics),它们有现成的 SDK,能帮你管理 consent 状态、暂停脚本、记录日志,比自己从零写靠谱多了——自己写容易漏细节,审计时容易被卡。