FB.login对话框未在Google Chrome上关闭

时间:2011-05-25 13:30:58

标签: facebook google-chrome login

我在应用程序中的click事件上调用FB.login()。该对话框按预期弹出,但当用户登录Facebook(和/或授权应用程序)时,对话框不会关闭。相反,它会加载一个白页(在对话框内),标题会更改为 XD代理

这只发生在Google Chrome上(我现在使用的是适用于Windows 7的最新版本)。

如果Chrome处于隐身模式,则不会发生这种情况。

fb-login“社交插件”在Chrome上运行良好。

为了进一步测试/调试,我创建了一个带有vanilla设置的新Facebook应用程序。我所做的唯一更改是在应用设置中设置网站网址。这是您可以用来重新创建此错误的HTML代码。

重新创建问题的示例代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Chrome Bug Test</title>
    </head>
    <body>
        <button onclick="dologin()">Login using Facebook</button>

        <div id="fb-root"></div>
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <script>
          FB.init({
            appId  : '[YOUR APP ID HERE]',
            status : true, // check login status
            cookie : true, // enable cookies to allow the server to access the session
            xfbml  : true  // parse XFBML
          });
        </script>

        <script type="text/javascript">
            function dologin(){
                FB.login(function(r){
                    if(console && console.log) {
                        console.log(r);
                    }
                });
            }
        </script>

    </body>
</html>

我尝试更改的Facebook设置

  1. 设置网站域名,但没有改变任何内容。
  2. 使用自定义channelUrl和频道文件也没有帮助。
  3. Facebook上追踪的相关错误

    Stack Overflow上的相关问题

    我见过很多人遇到过这个问题,但是让我感到困惑的是我无法找到具体的解决办法。 Facebook尚未对错误报告做出回应。一种解决方案是摆脱基于Javascript的身份验证代码,并使用服务器端机制(Facebook PHP SDK)完成。由于时间限制,我想避免这种情况。

    任何人都有任何想法如何解决这个问题?

6 个答案:

答案 0 :(得分:11)

我通过更改

FB.login()进行了类似的调用以关闭对话框
onclick="dologin()"

onclick="dologin(); return false;"

答案 1 :(得分:7)

考虑到这篇文章的年龄,我猜这张海报已经解决了这个问题;但是,鉴于这也是寻求解决类似问题的其他人的资源,我认为我会以实际情况包括我的经验。

我发现造成同样问题症状的原因是我不小心忘记在jQuery中的“click”侦听器处理程序中包含event.preventDefault();。 Facebook登录对话框弹出,允许我登录但不会消失。问题是该网站正在执行默认表单帖子操作,这会干扰Facebook回拨功能。

答案 2 :(得分:6)

我遇到了同样的问题。我做了两件事,首先我在FB.init()电话之前添加了这一行:

FB.Flash.hasMinVersion = function () { return false; };

然后我进入FB应用程序页面并添加了Site Domain(即test.com)。

我认为网站域名设置是关键,但我并非100%正面。我所知道的是,它似乎总是在所有浏览器中关闭,包括Chrome。

答案 3 :(得分:5)

与上述问题相关的简短回答:

all.js脚本加载到https

<script src="https://connect.facebook.net/en_US/all.js"></script>

如果您要解决与原始问题类似的问题,请更长时间的回答:

使用Google Chrome尝试登录。登录并在屏幕上悬挂空白弹出窗口后,按 F12 。这为Chrome带来了开发人员工具。单击“控制台”选项卡,您将有望看到错误。您可能会看到的与XD(跨域)问题有关。

即使您的特定问题与我遇到的问题不同,上述情况也应该引导您朝着正确的方向前进。

我的问题/解决方案特定于 Facebook C#SDK v6文档 - 教程代码使用以 //开头的网址加载 all.js 脚本 - 然后从与我的网站(即http)相同的方案加载脚本。登录后,弹出窗口试图将我从https Facebook登录重定向到我的http网站和宾果游戏,我们有XD问题。解决方案是专门从 https://connect.facebook.net/en_US/all.js 加载脚本,如下所示:

  // Load the SDK Asynchronously
  (function(d){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "https://connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
   }(document));

修改

经过一些考虑后,这种允许重定向到http的方法可能会通过允许其他人读取该请求中的数据然后重新使用来危害系统的安全性。我找不到任何相关的文档或示例,因此无法以某种方式结束,YMMV。

答案 4 :(得分:2)

FB.init为我解决问题后调用此代码段。但其他解决方案似乎适用于不同的情况。

$.browser.chrome = /chrome/.test(navigator.userAgent.toLowerCase());
if ($.browser.chrome || $.browser.msie) {
    FB.XD._origin = window.location.protocol + "//" + document.domain + "/" + FB.guid();
    FB.XD.Flash.init();
    FB.XD._transport = "flash";
  } else if ($.browser.opera) {
    FB.XD._transport = "fragment";
    FB.XD.Fragment._channelUrl = window.location.protocol + "//" + window.location.host + "/";
  }

答案 5 :(得分:1)

我在IE9中遇到了同样的问题,它似乎源于升级到Flash Player 10.建议的答案已经对我不起作用,因为找到{我试图解决它而失去了希望{3}}覆盖它。但是open bug at Facebook发布了Henson,为我修复了它。在我的网站母版的JavaScript中,我删除了这些行

    FB.UIServer.setLoadedNode = function (a, b) {
       //HACK: http://bugs.developers.facebook.net/show_bug.cgi?id=20168
        FB.UIServer._loadedNodes[a.id] = b;
    };

现在它有效。 (N.B.我没有检查IE8是否发布这些线路是为了克服回报。)