使用FB问题登录:带有“登录”对话框的FB弹出窗口被Web浏览器阻止

FB文档说:

如此函数的参考文档中所述,它会生成一个显示“登录”对话框的弹出窗口,因此只应在有人单击HTML按钮时调用(以便浏览器不会阻止弹出窗口)。

我按照说法做了,我将FB.login函数放入onCLick函数中。 但是“ Login dialog仍然被阻止。 为什么? 如何重新排序代码?

 // Facebook // Here is a click event, so FB.login is inside a click function. $("#login_btn_fb").on("click", function() { function getUserData(res, fCallback) { if(res.authResponse != null) { FB.api('/me', function(response) { console.log('/me_: ', response); }); } else { console.log("getUserData CANCEL: ", res); return; } }; FB.getLoginStatus(function(res) { var uid = null; var accessToken = null; if($.isPlainObject(res)) { // Fb+ App+ if(res.status == "connected") { console.error("connected"); uid = res.authResponse.userID; accessToken = res.authResponse.accessToken; getUserData(res, null); } // Fb+ App- else if(res.status == "not_authorized") { console.error("not_authorized"); FB.login(function(res) { getUserData(res, null); }, {scope: 'email,user_birthday,user_photos,public_profile,user_location'}); } // Fb- App- else { console.log("UNKNOWN"); FB.login(function(res) { // console.log("===UNK FB.login res: ", res); getUserData(res, null); }, {scope: 'email,user_birthday,user_photos,public_profile,user_location', return_scopes: true}); }; } // ERROR with FB else { alert("Facebook sign in failure. Please try again later."); return; } }); }); 

您没有将FB.login放在由User事件直接调用的函数中,而是放在FB.getLoginStatus的异步回调函数中。

使用FB.getLoginStatus刷新用户会话并检查用户是否在加载页面时正确登录(在FB.init之后),FB.login仅用于用户交互 – 当然不是在异步回调中。