在几年前我发布了《多语言判断用户是否启用了请勿追踪(Do Not Track)》一文,介绍了“请勿追踪”的功能,并引用资料给出了多种语言的代码,判断用户是否启用了该功能。在我洋洋得意给出 PHP 优化版的代码后,又介绍了 JavaScript 的方法,但并未实际给出代码,只是说非常麻烦,不建议使用。
今天,我在给这个博客加入统计代码时考虑了这个功能:当访客开启 DNT 时,本站不会插入统计代码;否则会有第三方统计脚本载入。于是又看了 DNT 的一些现状,回顾了那篇文章。我发现,尽管我那么说,但用 JavaScript 其实也是可以写的。当然,我的立场是一贯的:优先使用 HTTP 头(header)判断是最好的。JavaScript 的相关特性仍处于实验阶段。
JavaScript 代码
理想条件下
在理想条件下,我们可以直接这样写:
if(navigator.doNotTrack != '1'){
// 用户没开启请勿追踪,做点什么
}
但正如我在那篇文章中所说,各家浏览器甚至各个版本,对 DNT 的实现千奇百怪。所以这样是不推荐的。
现实中
参考 MDN 英文版(中文版太老了,尽管英文版也有点不符合事实,如 Edge 实际上已经使用 navigator.doNotTrack
而不是 window.doNotTrack
了),我写了这样一段:
var DNT = 'unspecified'; //default
if(typeof navigator.doNotTrack != 'undefined'){
DNT = navigator.doNotTrack;
}else if(typeof window.doNotTrack != 'undefined'){
DNT = window.doNotTrack;
}else if(typeof navigator.msDoNotTrack != 'undefined'){
DNT = navigator.msDoNotTrack;
} // DNT can be null, 'unspecified', '1', '0' 'yes' or 'no'
if(DNT == 'yes'){
DNT = '1'; // Do not track
}else if(DNT == 'no'){
DNT = '0'; // Please track
}
if(DNT != '1'){
// 用户没开启请勿追踪,做点什么
}
如此一来就可照顾到各种属性实现、各种值的取法,是兼容性最好的。在 Firefox、Chrome、Edge 和 Internet Explorer 中初步测试通过。
精简版
似乎没有什么浏览器实现了/还留有“我想被追踪”(DNT = 0)的选项。根据这个现状,再考虑浏览器实际的属性值,我们也可以缩成一句话:
if(!!navigator.doNotTrack && navigator.doNotTrack!='unspecified' || !!window.doNotTrack || !!navigator.msDoNotTrack){
// 请勿追踪
}else{
// 用户没开启请勿追踪,做点什么
}
本文可以结束了。下面只是一些参考信息。
参考信息
用户可以到 BrowserLeaks 判断自己浏览器的 DNT 开启情况。下面我会给出自己稍微测的一些结果。我这边竟然发现 Edge 不发送相关的 HTTP 头,IE 的头表现也有点怪异,不知是不是标签页的相互干扰,大家参考一下就行,我不敢保证正确性。
以下测试用的操作系统均为 Windows 10 (1803) 64 位,前面一节为浏览器启用 DNT,后面一节为禁用时的情况。
Firefox 61.0.1 (64 位)
DNT:✔ True (1)
navigator.doNotTrack:✔ True (1)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)DNT:× False
navigator.doNotTrack:× False (unspecified)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)
Chrome 67.0.3396.99(正式版本) (64 位)
DNT:✔ True (1)
navigator.doNotTrack:✔ True (1)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)DNT:× False
navigator.doNotTrack:× False (null)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)
Microsoft Edge 42.17134.1.0
可能有误,仅供参考。
DNT:× False
navigator.doNotTrack:✔ True (1)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)DNT:× False
navigator.doNotTrack:× False (null)
window.doNotTrack:× False (undefined)
navigator.msDoNotTrack:× False (undefined)
Internet Explorer 11.165.17134.0
可能有误,仅供参考。
DNT:× False
navigator.doNotTrack:× False (undefined)
window.doNotTrack:✔ True (1)
navigator.msDoNotTrack:× False (undefined)DNT:✔ True (1)
navigator.doNotTrack:× False (undefined)
window.doNotTrack:× False (null)
navigator.msDoNotTrack:× False (undefined)
2018-7-20 P.S.增加精简版代码。