用 JavaScript 判断用户是否启用了请勿追踪(DNT)

在几年前我发布了《多语言判断用户是否启用了请勿追踪(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.增加精简版代码。

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/464/

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情