如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销
Posted
技术标签:
【中文标题】如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销【英文标题】:how to detect log out from fb using JS SDK without refreshing the page 【发布时间】:2014-07-26 05:57:59 【问题描述】:朋友们,
我正在开发一个网站,其中Facebook javascript API
用于向我们的朋友发送消息。
当用户退出fb时,弹出js API对话框时显示错误
"Refused to display 'https://www.facebook.com/login.php?api_key=0&skip_api_login=1&display=dialo…cale%3Den_US%26name%3DAnything%26to%3D1791715188%26from_login%3D1&rcount=1' in a frame because it set 'X-Frame-Options' to 'DENY'."
目前,我正在使用 FB.getLoginStatus 来检测用户是否已注销。但这仅适用于第一次,我无法动态检查它(这意味着当我退出 fb 帐户并返回同一窗口并尝试发送下一条消息而不刷新时,它会显示上述错误。)。
这里如何动态检测用户当前已注销。有什么方法可以在不刷新页面的情况下动态检查FB.getLoginStatus
。
我在下面显示我的代码。
$(document).ready(function()
window.fbAsyncInit = function()
FB.init(appId: '**************', xfbml: true, cookie: true,status:true,oauth:true);
/*FB.Event.subscribe('auth.login', function()
//window.location.reload();
);*/
FB.Event.subscribe('auth.logout', function(response)
alert('logged out!');
);
;
function facebook_send_message(to,name) //function called when a button is clicked
FB.getLoginStatus(function(response)
if (response.status === 'connected')
console.log('how to check');
var uid = response.authResponse.userID;
var accessToken = response.authResponse.accessToken;
send_message(to,name);
else if (response.status === 'not_authorized')
console.log('not_authorized');
// the user is logged in to Facebook,
// but has not authenticated your app
else
console.log('hi');
FB.login(function(response)
if (response.authResponse)
send_message(to,name);
//getUserInfo(); // Get User Information.
else
console.log('Authorization failed.');
,scope: 'email');
);
send_message(to,name);
将在用户登录时发送消息,
目前第一次正常运行,但从第二次开始没有刷新页面,如果我们从fb注销,那么FB.getLoginStatus
仍然显示response.status
为'connected'
,因此出现错误。
等待您的友好回复。 提前致谢
【问题讨论】:
【参考方案1】:根据 Facebook,
https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
为了提高应用程序的性能,并非每次检查用户状态的调用都会向 Facebook 的服务器发出请求。在可能的情况下,响应会被缓存。在当前浏览器会话中第一次调用 FB.getLoginStatus 或 JS SDK 以 status: true 初始化时,响应对象将被 SDK 缓存。对 FB.getLoginStatus 的后续调用将从这个缓存的响应中返回数据。
这可能会导致用户自上次完整会话查找后登录(或退出)Facebook 时出现问题,或者如果用户在其帐户设置中删除了您的应用程序。
为了解决这个问题,您调用 FB.getLoginStatus 并将第二个参数设置为 true 以强制往返 Facebook - 有效地刷新响应对象的缓存。
FB.getLoginStatus(function(response)
// this will be called when the roundtrip to Facebook has completed
, true);
【讨论】:
以上是关于如何在不刷新页面的情况下使用 JS SDK 检测从 fb 注销的主要内容,如果未能解决你的问题,请参考以下文章
如何在不刷新页面的情况下使用 JavaScript 从 window.location (URL) 中删除哈希?
如何在不刷新页面的情况下使用 ajax 保存 acf_form