Firefox在v42.0中推出了名为跟踪保护的功能。它可以阻止Google Analytics、Marketo、LinkedIn等多个跟踪脚本。
我试图通过navigator.DoNotTrack
来检测,但无论是在常规模式下还是在Mac上使用Firefox 42.0的隐私模式下,它都返回unspecified
。
如何在JavaScript中检测用户是否打开了跟踪保护,既然navigator.DoNotTrack
失败了?
Firefox在v42.0中推出了名为跟踪保护的功能。它可以阻止Google Analytics、Marketo、LinkedIn等多个跟踪脚本。
我试图通过navigator.DoNotTrack
来检测,但无论是在常规模式下还是在Mac上使用Firefox 42.0的隐私模式下,它都返回unspecified
。
如何在JavaScript中检测用户是否打开了跟踪保护,既然navigator.DoNotTrack
失败了?
navigator.donottrack
只显示 "不追踪" 偏好设置。它并不能告诉您是否启用了不同的功能跟踪保护。当处于私密浏览模式时,跟踪保护会自动启用,但用户可以更改about:config中的设置以使其全时启用。
虽然您无法直接判断该功能是否已启用,但您可以通过类似以下内容的方式检查其效果:
var canreach = false;
$(function() {
$('<img/>')
.attr("src", "//apps.facebook.com/favicon.ico")
.load(function(){canreach = true;})
.css("display", "none")
.appendTo(document.body);
});
Firefox使用从Disconnect获取的列表来进行其跟踪保护;只需使用您知道在该列表中的域名和您知道存在的图像即可。
当然,这可能会标记许多导致图像无法加载的原因,包括网络连接问题、广告拦截软件、过滤代理等等。
navigator.doNotTrack
。 - Marcos Pérez GudeDeferred是一种延迟执行的机制
function whenNoTrackingProtection() {
if (!whenNoTrackingProtection.promise) {
var dfd = new $.Deferred();
whenNoTrackingProtection.promise = dfd.promise();
var time = Date.now();
$('<img/>')
.attr('src', '//apps.facebook.com/favicon.ico')
.on('load', dfd.resolve)
.on('error', function() {
if ((Date.now() - time) < 50) {
dfd.reject();
} else {
// The request took to long, it seems this is a network error.
dfd.resolve();
}
});
}
return whenNoTrackingProtection.promise;
}
或者不使用jQuery,使用Promise:
function whenNoTrackingProtection() {
if (!whenNoTrackingProtection.promise) {
whenNoTrackingProtection.promise = new Promise(function(resolve, reject) {
var time = Date.now();
var img = new Image();
img.onload = resolve;
img.onerror = function() {
if ((Date.now() - time) < 50) {
reject();
} else {
// The request took to long, it seems this is a network error.
resolve();
}
};
img.src = '//apps.facebook.com/favicon.ico';
});
}
return whenNoTrackingProtection.promise;
}
这里是一种没有使用jQuery,而是使用Promise的更新解决方案。感谢@miken32和@sleepwalker。
为什么我更喜欢这个解决方案而不是基于navigator.doNotTrack的解决方案?在Firefox中,navigator.doNotTrack在严格增强的跟踪保护模式下返回1,但在Google Chrome中,用户需要启用"发送"Do Not Track"请求与您的浏览流量"。
function whenNoTrackingProtection() {
if (!whenNoTrackingProtection.promise) {
whenNoTrackingProtection.promise = new Promise(function(resolve, reject) {
var time = Date.now();
var img = new Image();
img.onload = resolve;
img.onerror = function() {
if ((Date.now() - time) < 50) {
reject(new Error("Rejected."));
} else {
resolve(new Error("Takes too long."));
}
};
img.src = '//www.facebook.com/tr/';
}).then((result) => {
console.log("Tracking OK");
}).catch(e => {
console.log("Tracking KAO");
console.log(e)
});
}
}
whenNoTrackingProtection()