FB.login对话框在Google Chrome上不会closures

我在我的应用程序中的一个点击事件调用FB.login() 。 对话框popup按预期,但当用户login到Facebook(和/或授权的应用程序),对话框不会closures。 相反,它会加载一个白页(在对话框中),标题更改为XD Proxy

这只发生在谷歌浏览器(我正在使用Windows 7的最新版本)。

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

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

为了进一步testing/debugging,我创build了一个新的Facebook应用程序与香草设置。 我做的唯一更改是在应用程序设置中设置网站url。 这里是可以用来重新创build这个错误的HTML代码。

用于重新创build问题的示例代码

 <!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和频道文件,也没有帮助。

在Facebook上跟踪相关的错误

  • http://bugs.developers.facebook.net/show_bug.cgi?id=14789
  • https://github.com/facebook/connect-js/issues/269
  • http://bugs.developers.facebook.net/show_bug.cgi?id=12112
  • http://developers.facebook.com/bugs/278247488872084

这里关于堆栈溢出的相关问题

  • 用FB连接的空白popup
  • Facebook连接空白popup在铬
  • Facebook Connectloginredirect到Chrome和Safari
  • https://stackoverflow.com/questions/4423718/blank-page-with-fb-connect-js-sdk-on-after-permission-request
  • 在Internet Explorer 8中,Facebook连接显示空白popup窗口
  • 在IE中使用Fb.login时,Facebookloginpopup窗口保持打开状态
  • JS SDK的FB.login()工作,但popup对话框保持打开后login
  • 当通过Chrome网上应用店安装页面时,Facebooklogin在“XD Proxy”处挂起
  • XD代理Facebook
  • XD_Proxypopup窗口不会closures

我看过很多人遇到过这个问题,但是我感到困惑的是,我还没有find具体的解决办法。 Facebook尚未响应错误报告。 一个解决scheme将摆脱基于Javascript的身份validation代码,并完全使用serverside机制(脸谱PHP的SDK)。 我想避免由于时间限制。

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

我有类似的调用FB.login()来通过改变closures对话框

 onclick="dologin()" 

 onclick="dologin(); return false;" 

鉴于这篇文章的年龄,我猜测海报已经解决了这个问题。 然而,鉴于这也是寻求解决类似问题的其他人的资源,我想我会包括我的经验,以防万一。

我发现是什么导致这个相同的问题症状,我不小心忘记包括event.preventDefault(); 在我的“点击”jQuery中的监听器处理程序。 Facebooklogin对话框popup,让我login,但不会消失。 问题是该网站正在执行默认的表单发布操作,这是干扰Facebook的callbackfunction。

我有同样的确切问题。 我做了两件事,首先在FB.init()调用之前添加了这一行:

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

然后我进入FB应用程序页面,并添加了网站域名(即test.com)。

我认为网站域名设置是关键,但我不是100%正面的。 我所知道的是,现在似乎总是closures所有的浏览器,包括铬。

有关上述问题的简短回答:

通过https加载all.js脚本。

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

如果您正在解决与原始问题类似的问题,则需要较长的回答:

使用Google Chrome尝试login。 login后,在屏幕上挂上空白popup式窗口,按F12键。 这为Chrome提供了开发者工具。 单击控制台选项卡,您将希望看到该错误。 你可能会看到的是与XD(跨域)问题有关。

即使你的问题与我遇到的问题不同,上面的问题也应该引导你朝着正确的方向前进。

我的问题/解决scheme是特定于Facebook C#SDK v6文档 – 教程代码使用以//开头的URL加载all.js脚本,然后从与我的网站(即http)相同的scheme加载脚本。 login后,popup窗口试图将我从httpslogin页面redirect到我的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)); 

编辑:

经过一番考虑,这种允许redirect到http的方法可能会危及系统的安全性,允许其他人读取该请求中的数据,然后重新使用。 我找不到任何相关的文件或例子,所以我不能以这种或那种方式来总结YMMV。

FB.init之后调用这个片段解决了我的问题。 但其他解决scheme似乎已经适用于不同的情况。

 $.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 + "/"; } 

我一直在IE9遇到同样的问题,它似乎源于升级到Flash Player 10.提出的答案已经不适合我,我已经失去了希望,试图修复它,因为在Facebookfind一个开放的错误覆盖它。 但是, 亨森已经在类似的问题上发表了一个解决这个问题的答案 。 在我的网站主人的JavaScript中,我删除了这些行

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

现在它工作。 (NB我没有检查IE8是否发行这些行是为了克服收益。)