进行页面刷新时不调用FB.getLoginStatus(Facebook Javascript SDK)

FB.getLoginStatus is not called when doing a page refresh (Facebook Javascript SDK)

本文关键字:getLoginStatus Facebook Javascript SDK FB 调用 刷新      更新时间:2023-09-26

我正在尝试使用他们的Javascript SDK实现一个与用户的Facebook配置文件连接的网页。根据他们的初始文件:

<body>
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
  FB.init({appId: '[my-appid]', status: true, cookie: true, xfbml: true});
  //Check if user is logged-in to facebook:
  FB.getLoginStatus(function(response) {
     if (response.session) {
         // Here I use some FB.api functions 
         // and get some data I need about the user's facebook profile,
         // and make same changes to the document html accordingly...
     }
  });
};
(function() {
  var e = document.createElement('script'); 
  e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
  e.async = true;
  document.getElementById('fb-root').appendChild(e);
}());
</script>

FB.getLoginStatus函数是在FB.init之后编写的,正如他们建议的那样。当我第一次加载页面时,一切都正常。但是,如果我点击刷新(F5)-则永远不会调用FB.getLoginStatus!因此不收集所需的信息。如果我在FB.init后面放一个"警报",它会起作用,我会看到的。如果我在FB.getLoginStatus中放入"alert",则它不起作用。如果我执行"无缓存刷新"(使用Ctrl-F5而不是F5),那么一切都可以工作。

为什么?我怎样才能使它正常工作?

谢谢。

我在试图解决这个问题时遇到了同样的问题。FB.init是异步的,警报会导致足够的延迟来初始化所有内容。FB.getLoginStatus很可能被调用,但正在出错。您在错误控制台中看到任何错误吗?您可能会看到关于在初始化之前调用FB.getLoginStatus的错误。

另一种可能性是xfbml设置为true。Facebook有时似乎会进行双重初始化,导致您对init的调用失败。尝试将xfbml设置为false。如果需要在页面上渲染FBML,请渲染特定元素。

FB.XFBML.parse(document.getElementById('idOfElement'));

问题不在于"FB.getLoginStatus从不被调用"。您的代码调用FB.getLoginStats()。它从不调用响应函数。

打开另一个选项卡,转到facebook.com。如果你的浏览器登录到了facebook,请尝试注销,然后尝试重现问题。

如果你的浏览器作为测试帐户登录到facebook,你可能会遇到这个问题。或者,一个帐户没有权限查看处于沙箱模式的应用程序。注销facebook应该可以解决这些情况下的问题。

我在firefox中看到过这个问题,当它发生时,控制台中没有错误。

这是一个很长的机会,但我遇到了同样的竞争条件,因为我在客户端模板渲染过程中无意中替换了fb-rootdiv。确保这个div在页面加载时存在,并且没有被任何其他代码触及。

遇到了同样的问题,fbAsyncInit以及其中的getLoginStatus在我按下ctrl+F5时没有被调用经过大量调试,我发现问题在于我没有按照Facebook示例所示的正确顺序使用javascript-sdk代码:https://developers.facebook.com/docs/facebook-login/web我在页面的页眉中有fb根div和加载sdk的代码,然后在页脚中调用fbAsync方法。当我把所有东西放在一起时,问题得到了解决:

<div id="fb-root"></div>
<script type="text/javascript">
window.fbAsyncInit = function() {
FB.init({
    appId      : '<?php echo $appID; ?>',
    cookie     : true,
    xfbml      : true,
    version    : 'v2.8'
});
FB.getLoginStatus(function(response) {
    checkstatus(response);
});
};
/// Load the SDK asynchronously
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>