Как определить, использует ли пользователь защиту отслеживания в Firefox 42+
Firefox запустил функцию Защита от слежения в версии 42.0. Он блокирует несколько сценариев отслеживания, таких как Google Analytics, Marketo, LinkedIn и т.д.
![Консольный выход]()
Я пытался обнаружить его через navigator.DoNotTrack
, но он возвращает unspecified
в обоих случаях - просмотр в обычном режиме и просмотр в частном режиме - с использованием Firefox 42.0 на Mac.
Как я могу определить в JavaScript, просматривается ли пользователь на веб-сайте с защитой отслеживания, поскольку navigator.DoNotTrack
не удается?
Ответы
Ответ 1
navigator.donottrack
показывает только настройку "Не отслеживать" . Он не сообщает, включена ли защита отслеживания, которая является другой функцией. Защита от слежения включена автоматически в режиме частного просмотра, но пользователи могут изменить настройку примерно: 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 для его защиты от слежения; просто используйте домен, который, как вы знаете, в этом списке, и изображение, которое, как вы знаете, будет существовать.
Конечно, это может означать любое количество причин, по которым изображение не загружается, включая проблемы с сетевым подключением, программное обеспечение для блокировки рекламы, фильтрацию прокси и т.д.
Ответ 2
Вот немного улучшенная версия ответа miken32 с использованием Deferred:
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;
}