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

Pet*_*jda 12 javascript firefox privacy navigator do-not-track

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

控制台输出

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

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

mik*_*n32 13

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);
});
Run Code Online (Sandbox Code Playgroud)

Firefox使用Disconnect获得的列表来跟踪保护; 只需使用您知道在该列表中的域,并且您知道的图像将存在.

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

  • 您是否阅读了我的回答@MarcosPérezGude 的第一句话?它们是完全不同的两种东西。 (5认同)
  • 是! 谢谢.这解决了我的问题. (2认同)
  • 此刻此刻不起作用。它是在主要浏览器上实现的更可靠的`navigator.doNotTrack`。 (2认同)

Sle*_*ker 5

这是使用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;
}
Run Code Online (Sandbox Code Playgroud)

或没有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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这段代码,但不幸的是我的使用 `//apps.facebook.com/favicon.ico` 不再在隐私模式下中断。我改为使用托管在被隐私模式阻止的服务上的类似资产。 (2认同)

jro*_*ell 5

这是一个不使用 jQuery、使用 Promise 的更新解决方案。感谢@miken32 和@sleepwalker。

为什么我更喜欢这个解决方案而不是基于 navigator.doNotTrack 的解决方案?在 Firefox 中,navigator.doNotTrack 在严格的增强跟踪保护上返回 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()
Run Code Online (Sandbox Code Playgroud)