Facebook在Chrome中提供“不安全的JavaScript尝试访问带URL的框架”错误

时间:2010-08-26 17:50:39

标签: javascript facebook google-chrome

我的示例Facebook应用程序昨天在Chrome中运行良好。该页面通过JavaScript SDK集成了Silverlight广告Facebook。我可以查看基本登录状态,登录Facebook,获取您的姓名并注销。

今天,在我没有任何变化的情况下,Chrome在Google搜索结果中出现了一个非常常见的JavaScript错误,但没有真正的答案。它仍然适用于IE和Firefox。

以下是公开网址:

http://www.andrewdothay.net/prj/facebook/

当您在Chrome中打开JavaScript控制台时,会抛出大量这些错误:


不安全的JavaScript尝试使用网址访问框架

来自带有网址http://www.facebook.com/login.php?api_key=151352704876752&cancel_url=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df1175dd3f%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&channel_url=http%3A%2F%2Fwww.andrewdothay.net%2Fprj%2Ffacebook%2F&display=popup&fbconnect=1&locale=en_US&method=auth.login&next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2Fxd_proxy.php%23cb%3Df3c546942%26origin%3Dhttp%253A%252F%252Fwww.andrewdothay.net%252Ff304d89d8%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df3760623c%26result%3DxxRESULTTOKENxx&return_session=1&sdk=joey&session_version=3&v=1.0的框架的

http://www.andrewdothay.net/prj/facebook/

域,协议和端口必须匹配。


有关Chrome浏览器的最新动态吗?


更新

我发现今天的机器上的Chrome在我调用FB.login()时阻止了登录弹出窗口,但我知道我昨天没有在JavaScript控制台中收到这190条错误消息。

因此,当我允许Chrome中的弹出窗口时,它确实适用于最终用户,但所有这些新的错误消息都会影响我作为开发人员的诊断体验。

8 个答案:

答案 0 :(得分:28)

我找到了解决方案。如果在没有用户操作的情况下执行FB.login,webkit将阻止弹出窗口。

例如,我在我的项目中使用了一个邀请系统。输入/文本输入邀请代码。我检查了邀请代码是否有ajax / post请求。如果它可用,我运行FB.login()。正如您所猜测的,浏览器阻止了弹出窗口,并且在js控制台上出现了大量错误。

因此,您必须在用户操作后运行FB.login()。我将在ajax / post和FB.login()之间放置一个facebook登录按钮。用户必须点击它 - 很糟糕 - 但他们不会发现问题。

顺便说一下,问题在几天之后再次发生。我认为这是关于浏览器的信任系统。当你开发它时,你经常访问很多次,浏览器认为它最初是可靠的。我不确定这部分,但我的解决方案有效。

答案 1 :(得分:5)

在我的情况下,这是因为facebook JS在单页上多次加载:一个用于登录,第二个用于“喜欢”按钮。删除“喜欢”模块中的引用可以节省时间。

答案 2 :(得分:2)

在我的情况下,问题与<div id="fb-root"></div>标记有关。在开场<body>标记as recommended by the docs之后,我并未立即将其置于其中。

将它放在正确的位置后,“不安全的JavaScript ...”错误停止了。

答案 3 :(得分:2)

从我的FB.init调用中删除'xfbml:true'选项为我修复了此问题。

我在Android Jelly Bean的默认互联网浏览器中遇到了问题

答案 4 :(得分:1)

MücahitYılmaz是对的。以下面粘贴的示例为例,如果使用setTimeout()方法,则会失败,其他方面也可以。我仍然在循环中收到警告消息,直到我正确登录,但这是一个很小的代价。我相信用户不会看到它。

$(document).ready(function() {
$("#facebook_link").click(function() {
    //setTimeout(fb);
    fb();
    return false;
});

function fb() {
    FB.getLoginStatus(function(response) {
        if (response.session) {
            // logged in and connected user, someone you know
            gotResponse(response);
        } else {
            // no user session available, someone you dont know
            FB.login(function(response) {
                if (response.session) {
                    // user successfully logged in
                    gotResponse(response);
                } else {
                    // user cancelled login, do nothing
                }
            });
        }
    });
}

function gotResponse(response) {
    console.dir(response);
}

});

重现起来很容易:在另一个标签页面登录Facebook,然后尝试使用此代码,您将看不到任何警告。注销,然后尝试代码,你会收到警告。这是因为它击中了.login块。

答案 5 :(得分:1)

我在Chrome浏览器中遇到此问题,这是由于我的Chrome设置。我将浏览器设置为禁止第三方网站设置cookie数据。允许弹出窗口对我来说不是问题。创建facebook iFrame时,必须设置一个cookie,然后用它来跟踪用户是否需要登录。如果不允许设置该cookie,则该站点将失败。在facebook api中有用的一件事是一个显示某些东西失败的设置。我不认为这是一个可以订阅并分配回调的事件。

这是订阅时FB javascript sdk的链接。对于查找失败请求的回调的任何响应都将受到赞赏 https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

答案 6 :(得分:1)

在我的情况下,问题与协议类型有关: 从:

<div class="fb-like-box" data-href="https://www.facebook.com/xxxxxx"

为:

<div class="fb-like-box" data-href="http://www.facebook.com/xxxxxx"

由于我的网上商店没有使用https,我从likebox的data-href属性中删除了's'。

答案 7 :(得分:0)

MücahitYılmaz的解决方案也适用于我。我不需要访问用户的信息,因此我从示例应用程序中删除了登录脚本。同时删除了欢迎消息以及需要存储在$basic变量中的信息的任何信息。

相关问题