火狐浏览器阻止 Facebook Js

11

升级到Firefox 42.0后,我遇到了一些奇怪的行为...

我是这样调用FB.init方法的:

FB.init({ 
        appId: '{$appid}',
        status: true, 
        cookie: true,
        xfbml: true,
        oauth: true
    });

但在Firefox浏览器中,它被阻止了,我收到了警告:

因为启用了跟踪保护,所以位于“https://connect.facebook.net/en_US/all.js”的资源已被阻止。

这是默认行为,我没有设置任何额外的安全措施之类的。

该怎么办?

编辑-在获得帮助和搜索后,发现这是一个更大的问题:

原来Firefox的Do Not Track和跟踪保护 是两个不同的东西:

Do Not Track 被启用在首选项/选项 > 隐私 > "告诉网站我不想被追踪"。启用会发送DNT标头,但它不会阻止任何请求。

跟踪保护 被启用在about:config > privacy.trackingprotection.enabled。启用不会发送DNT标头,但会基于Disconnect的拦截列表阻止请求。所以检测2并不像检查navigator.doNotTrack那样容易,因为该属性仅适用于1。

解决方案(临时)- 尝试执行FB.init,如果出错则弹出警告。

try {
        FB.init({ 
            appId: '{$appid}',
            status: true, 
            cookie: true,
            xfbml: true,
            oauth: true
        });
    }catch(err) {
        alert('Some info for the user...');
    }

有没有更好的解决方案?


3
这是否发生在“隐私浏览窗口”中? - Jaromanda X
在我的Firefox 42.0上它可以工作。这可能是你的问题之一... - vanntile
你好,你解决了这个问题吗?我的意思是,解决方案不能仅仅是进入about:config,因为系统用户不会这样做... - Gabrielle
嗨,它基于客户端设置。 - Peter
4个回答

7

谢谢。由于我需要使用FB方法进行登录,我该如何通过JavaScript自动取消此跟踪保护,而不是依靠用户? - Peter
如果可以自动停用这个功能,那岂不是很奇怪吗?这样一来,跟踪保护的整个意义就化为乌有了...不过既然默认情况下不会启用它,那么就不应该有什么问题。 - andyrandy
1
我刚刚升级了Firefox,它默认是开启的(至少对我来说是这样)。我相信许多用户会保持这种状态。使用JavaScript检测并提醒用户会很好。我尝试过"navigator.doNotTrack",但这不起作用,因为这是跟踪保护!仍在寻找至少检测“跟踪保护”的解决方案。 - Peter
1
升级 Firefox 会保留你的设置,这并不意外。 - andyrandy
1
我也做了同样的事情,它对我有用。答案在这里:https://dev59.com/f5Hea4cB1Zd3GeqPjgNY#34243073 - Elshan
显示剩余2条评论

4

0
如果有人来到这篇文章,想要找到如何处理这个错误的解决方法。我想这个答案可能会有所帮助。
            (function (d, s, id) {
                let js,
                    fjs = d.getElementsByTagName(s)[0];
                if (d.getElementById(id)) {
                    return;
                }
                js = d.createElement(s);

//here goes the error handling 
                js.onerror = (e) => {
                    //here we can handle the error
                    //we can show the user why the page isn't loading correctly
                }

                js.id = id;
                js.src = 'https://connect.facebook.net/en_US/sdk.js';
                fjs.parentNode.insertBefore(js, fjs);
            })(document, 'script', 'facebook-jssdk');

-1
一种解决方法是在所有脚本资源加载完成后检查FB对象是否存在。这样,无论什么原因导致脚本加载失败,我们都能得到保障。
$(window).on("load", function() {

    // If Facebook SDK failed to load ... 
    if (typeof FB === "undefined") {

         // ... then change interface/set global variable to handle missing FB

    }

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接