如何检测用户是否在 Firefox 42+ 中使用跟踪保护
How to detect if a user is using tracking protection in Firefox 42+
Firefox 在 v42.0 中推出了一项名为 Tracking protection 的功能。它会阻止多个跟踪脚本,例如 Google Analytics、Marketo、LinkedIn 等
我试图通过 navigator.DoNotTrack
检测到它,但在这两种情况下都 returns unspecified
——在常规模式下浏览,在私人模式下浏览——在[上使用 Firefox 42.0 =25=].
由于 navigator.DoNotTrack
失败,我如何在 JavaScript 中检测用户是否正在查看启用了跟踪保护的网站?
navigator.donottrack
only shows the setting of the "Do not track" preference. It does not tell if tracking protection, which is a different feature, is enabled. Tracking protection is enabled automatically when in private browsing mode, but users can change a setting in 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 uses a list obtained from Disconnect 用于跟踪保护;只需使用您知道在该列表中的域,并且您知道的图像将存在。
当然,这可以标记出图片无法加载的任何原因,包括网络连接问题、广告拦截软件、过滤代理等。
这里是使用 Deferred 的 miken32 答案的略微改进版本:
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 returns 1 严格增强跟踪保护,但在 Google Chrome 中,用户需要启用发送“禁止跟踪”请求和您的浏览流量。
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()
Firefox 在 v42.0 中推出了一项名为 Tracking protection 的功能。它会阻止多个跟踪脚本,例如 Google Analytics、Marketo、LinkedIn 等
我试图通过 navigator.DoNotTrack
检测到它,但在这两种情况下都 returns unspecified
——在常规模式下浏览,在私人模式下浏览——在[上使用 Firefox 42.0 =25=].
由于 navigator.DoNotTrack
失败,我如何在 JavaScript 中检测用户是否正在查看启用了跟踪保护的网站?
navigator.donottrack
only shows the setting of the "Do not track" preference. It does not tell if tracking protection, which is a different feature, is enabled. Tracking protection is enabled automatically when in private browsing mode, but users can change a setting in 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 uses a list obtained from Disconnect 用于跟踪保护;只需使用您知道在该列表中的域,并且您知道的图像将存在。
当然,这可以标记出图片无法加载的任何原因,包括网络连接问题、广告拦截软件、过滤代理等。
这里是使用 Deferred 的 miken32 答案的略微改进版本:
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 returns 1 严格增强跟踪保护,但在 Google Chrome 中,用户需要启用发送“禁止跟踪”请求和您的浏览流量。
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()