如何检测用户是否在Firefox 42+中使用跟踪保护

时间:2015-11-27 14:17:16

标签: javascript firefox privacy navigator do-not-track

Firefox在v42.0中推出了一项名为Tracking protection的功能。它会阻止多个跟踪脚本,如Google Analytics,Marketo,LinkedIn等。

Console output of the "Tracking protection" warnings

我试图通过navigator.DoNotTrack检测到它,但在两种情况下都会返回unspecified - 在普通模式下浏览,在私人模式下浏览 - 在Mac上使用Firefox 42.0。

我是如何在JavaScript中检测用户是否正在查看启用了跟踪保护的网站,因为navigator.DoNotTrack失败了?

3 个答案:

答案 0 :(得分:11)

navigator.donottrack仅显示"Do not track"偏好设置。它不会告知是否启用了tracking protection,这是一个不同的功能。在私密浏览模式下,会自动启用跟踪保护,但用户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 usesDisconnect获取的跟踪保护列表;只需使用您知道在该列表中的域,并且您知道的图像将存在。

当然,这可能会标记图像无法加载的任何原因,包括网络连接问题,广告拦截软件,过滤代理等。

答案 1 :(得分:4)

以下是使用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 seams this is a real 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 seams this is a real network error
                    resolve();
                }
            };
            img.src = '//apps.facebook.com/favicon.ico';
        });
    }

    return whenNoTrackingProtection.promise;
}

答案 2 :(得分:2)

这里是更新的解决方案,不使用jQuery,而是使用Promise。谢谢@ miken32和@sleepwalker。

为什么我更喜欢这种解决方案而不是基于navigator.doNotTrack的解决方案?在Firefox中,navigator.doNotTrack在严格的增强跟踪保护上返回1,但在Google Chrome浏览器中,用户需要启用发送“不跟踪”请求的浏览量。

Jackson