如何在获得同意前阻止脚本:三种方法对比
问题:标签触发得太早
同意横幅只有在其背后的标签尊重访问者的选择时才有效。最常见的失败很简单:横幅出现了,但在任何人点击之前,分析和广告脚本已经加载并设置了标识符。要解决这个问题,就需要在获得同意之前阻止脚本。有三种可行的方法。
方法一:改写脚本类型
只有当script元素的type是JavaScript类型时,浏览器才会执行它。如果你把type改为text/plain,浏览器就会忽略该脚本。然后你添加一个数据属性,记录该脚本属于哪个同意类别:
- 把
type="text/javascript"改为type="text/plain"。 - 添加类似
data-category="analytics"的属性。 - 当访问者同意该类别时,一个小型加载器会把type换回来并插入脚本,使其运行。
适用于:模板中少数已知的内联或外部脚本。注意:由其他脚本注入的脚本不会经过你的模板,因此永远不会被改写。
方法二:在标签管理器中控制标签
如果你的标签位于Google Tag Manager或类似工具中,你可以让容器保留在页面上,并通过感知同意状态的触发器来控制触发。每个标签都被赋予一项同意要求,只有当相应的同意状态被授予时,标签管理器才会触发它。最大的优势是集中控制:营销人员无需改动模板就能添加标签,而且规则会跟随标签。
适用于:拥有大量营销标签的网站。注意:位于容器之外的硬编码脚本,以及自行加载更多脚本的自定义HTML标签。
方法三:在获得同意后动态加载脚本
在这种方式下,你把script标签从页面中完全移除,并编写一个函数,仅在同意事件之后才注入它们。对于单页应用,以及希望完全掌控的开发者来说,这是最干净的选择:
- 监听来自你的CMP的同意回调。
- 检查哪些类别已被授予。
- 创建一个script元素,设置其来源,并将其追加到文档中。
- 在脚本的load处理程序中运行任何初始化代码。
适用于:有构建步骤的现代应用。注意:别忘了处理回访访问者,其已存储的选择必须在页面加载时触发加载,而无需新的点击。
处理撤回
在获得同意前阻止只完成了一半的工作。如果访问者之后撤回同意,请停止调用这些工具,并确保它们不再继续读取或写入标识符。从页面中移除脚本并不会移除已在内存中的代码,所以撤回后重新加载页面往往是最简单可靠的做法。
你应该选择哪一种?
- 脚本较少、使用服务端渲染的模板:方法一。
- 营销标签很多,且由非开发人员编辑:方法二。
- 单页应用或定制前端:方法三。
- 混合环境通常会组合其中两种。只需确保没有任何标签被这些方法全都漏掉。
如何测试
- 打开一个已清除缓存的隐私窗口。
- 在加载页面之前,先打开浏览器开发者工具的Network和Application标签页。
- 加载页面,且不要碰横幅。确认没有发送任何分析或广告请求,也没有出现相关的Cookie或存储项。
- 只接受一个类别,并确认只有对应的脚本被加载。
- 拒绝全部,重新加载,并重复第一次检查。
- 撤回同意,并验证上述行为。
FlexyConsent的定位
FlexyConsent支持IAB TCF 2.4和Google Consent Mode v2,并且是经Google认证的CMP(CMP ID 317)。无论你选择哪种拦截方法,横幅的职责都是给你的代码一个关于访问者选择的明确信号。确保每个脚本都遵守该信号,则是你的职责。
要点回顾
- 在访问者做出选择之前就加载的脚本,会让横幅形同虚设。
- 类型改写、标签管理器触发器和动态加载,各自适合不同类型的网站。
- 由其他脚本注入的脚本是最常见的漏洞。
- 不仅要处理首次访问,还要处理回访访问者和撤回。
- 在碰横幅之前,先在打开开发者工具的干净隐私窗口中测试。