在我的应用程序中,我有一个像这样的函数:
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处理登录事件的方式有关(在每个页面加载时触发)但我无法弄清楚我应该如何在应用程序代码中考虑到这一点。
答案 0 :(得分:4)
我相信当您加载页面时,onlogin事件会因您登录Facebook而触发。然后,当您的用户单击该按钮时,它也会触发该事件。如果您没有首先登录,则onlogin事件不会在加载时触发。
更新:为了避免这种情况,只是不要将getProfile挂钩到onlogin事件,除非在基于FB.getLoginStatus方法的if语句中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.
}
});