【问题标题】:Facebook gives "Unsafe JavaScript attempt to access frame with URL" error in ChromeFacebook 在 Chrome 中给出“不安全的 JavaScript 尝试使用 URL 访问框架”错误
【发布时间】:2010-08-26 17:50:39
【问题描述】:

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

今天,在我没有做任何更改的情况下,它在 Chrome 中出现了一个 JavaScript 错误,这在 Google 搜索结果中很常见,但没有真正的答案。它仍然在 IE 和 Firefox 中运行良好。

这是公开网址:

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

当您在 Chrome 中打开 JavaScript 控制台时,它会引发大量以下错误:


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

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 来自带有 URL http://www.andrewdothay.net/prj/facebook/ 的框架。

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


您对 Chrome 浏览器的最新情况有任何想法吗?


更新

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

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

【问题讨论】:

  • 很奇怪。我在 chrome 的 facebook 应用程序上经常遇到这个错误,有时在 FF 中也有类似的错误。但是我通常只收到一次错误,然后一切都按预期工作。

标签: javascript facebook google-chrome


【解决方案1】:

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

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

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

顺便说一句,几天后问题再次出现。我认为这是关于浏览器的信任系统。当你开发它时,你访问了很多次,浏览器一开始认为它是可靠的。我不确定这部分,但我的解决方案有效。

【讨论】:

  • 那么这是否意味着我们不能使用 FB.Event.subscribe('auth.statusChange', onStatus); ?
  • @BeaverProj 我没试过,所以我不知道。
  • 用户操作需要与 FB.login 调用有多接近?我收到一个弹出窗口,但它只是说“发生错误。请稍后再试”。我有一个调用函数的按钮,然后它本身调用 FB.login。你觉得这还不够直接吗?
  • @Skeater 如果没有预览您的代码,我不能肯定地说,但使用 jquery,$(x).click(function(){ FB.login () ... }) 就足够了。
  • 我有另一个关于它的 SO 帖子:stackoverflow.com/questions/12849065/… 如果你能看一下,我会很高兴的。
【解决方案2】:

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

【讨论】:

  • 对我来说类似。我在使用 URL //connect.facebook.net/en_US/all.js#xfmbl=1&appId=[appId] 初始化 SDK 后调用 FB.init - 我认为 xfmbl=1 会导致隐式 FB.init,尽管 facebook文档对此尚无定论。当我删除对 FB.init 的单独调用时,问题就消失了。
  • xfmbl(必须读作“transfumble”)似乎没有什么不同。我遇到了完全相同的问题。
【解决方案3】:

Mücahit Yı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 块。

【讨论】:

    【解决方案4】:

    在我的情况下,问题与<div id="fb-root"></div> 标签有关。我没有把它放在开头的<body>标签之后,as recommended by the docs

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

    【讨论】:

      【解决方案5】:

      从我的 FB.init 调用中删除 'xfbml : true' 选项为我解决了这个问题。

      我在 Android Jelly Bean 上的默认 Internet 浏览器中遇到了问题

      【讨论】:

        【解决方案6】:

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

        这是关于订阅的 FB javascript sdk 的链接。任何有关为失败请求查找回调的回复将不胜感激。
        https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/

        【讨论】:

          【解决方案7】:

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

          <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”。

          【讨论】:

          【解决方案8】:

          Mücahit Yılmaz 的解决方案也对我有用。我不需要访问用户的信息,因此我从示例应用程序中删除了登录脚本。还删除了欢迎消息和任何需要存储在 $basic 变量中的信息的信息。

          【讨论】:

            猜你喜欢
            • 2012-06-21
            • 2014-12-27
            • 2011-11-18
            • 1970-01-01
            • 2012-05-26
            • 2012-12-07
            相关资源
            最近更新 更多