2

在我的应用程序中,我有一个这样的功能:

getProfile = function() {
  FB.api('/me', function(response) {
    console.log(response);
  });
  return false;
};

它通过 JavaScript 从 Facebook Graph API 请求“我”对象,当我将它附加到常规链接的 onClick 事件或直接从控制台调用它时,它按预期工作,但是当我尝试从 Facebook 调用它时登录按钮:

  <fb:login-button onlogin="getProfile()">
    Get Profile
  </fb:login-button>

只有当我退出 Facebook 并随后通过对话框登录时,我才会得到预期的响应;如果我在已经登录时单击按钮,我会得到:

两个相同的请求

如果我将响应推送到浏览器:

getProfile = function() {
  FB.api('/me', function(response) {
    console.log(response);
    var
      profile = document.getElementById('profile'),
      p = document.createElement('p');
    p.innerHTML = response.first_name;
    profile.appendChild(p);
  });
  return false;
};

当然,我得到两个段落,其中有我的名字。

谁能发现我做错了什么?到目前为止,我的谷歌搜索让我确信这与 SDK 处理登录事件的方式(在每次页面加载时触发)有关,但我无法弄清楚我应该如何在应用程序代码中解释这一点。

4

1 回答 1

4

我相信当您加载页面时会触发 onlogin 事件,因为您已登录 Facebook。然后,当您的用户单击按钮时,它也会触发事件。如果您一开始没有登录,则 onlogin 事件不会在加载时触发。

更新:为了避免这种情况,除非在基于 FB.getLoginStatus 方法的 if 语句中,否则不要将 getProfile 挂钩到 onlogin事件http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/放,如果您已登录,请不要附加 onlogin 事件,否则在 onlogin上执行 FB.Event.subscribe http://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe/事件和方法将在用户通过 XFBML 生成的登录按钮登录时运行。

FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
  //print the response data into the paragraph here
} else if (response.status === 'not_authorized') {
  // the user is logged in to Facebook, 
  // but has not authenticated your app
  FB.event.subscribe( 'auth.login', function(){
    getProfile();
  });
} else {
  // the user isn't logged in to Facebook.
}
});
于 2012-07-25T18:57:04.610 回答