Javascript 为什么FBAsyninit/fb.Event.subscribe中的其他情况不起作用?
我想知道为什么Javascript 为什么FBAsyninit/fb.Event.subscribe中的其他情况不起作用?,javascript,facebook,facebook-graph-api,facebook-javascript-sdk,Javascript,Facebook,Facebook Graph Api,Facebook Javascript Sdk,我想知道为什么response.status==“not authorized” “else”案例(“未知”,即用户未登录facebook)也未被执行。当我登录到我的应用程序时,response.stats== “已连接”。但是,当我在Chrome中打开incognito模式时,其他情况下的testAPI()函数不会被调用。有人知道为什么吗 window.fbAsyncInit = function() { FB.init({ appId : 'appnumberhere',
response.status==“not authorized”
“else”案例(“未知”,即用户未登录facebook)也未被执行。当我登录到我的应用程序时,response.stats==
“已连接”
。但是,当我在Chrome中打开incognito模式时,其他情况下的testAPI()函数不会被调用。有人知道为什么吗
window.fbAsyncInit = function() {
FB.init({
appId : 'appnumberhere', // App ID
channelUrl : '//localhost/appname/channel.php', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
FB.Event.subscribe('auth.authResponseChange', function(response) {
if (response.status === 'connected') {
testAPI(); // works
} else if (response.status === 'not_authorized') {
testAPI(); // not called. Nothing in console.
FB.login();
} else {
testAPI(); // not called. Nothing in console.
FB.login();
}
});
}); // end async init function
testAPI函数:
function testAPI() {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
});
}
另外,如果我没有登录,我也不会看到facebook登录对话框弹出,这就是我认为fb.login()应该调用的
额外旁注
另外,奇怪的是,我需要在FB SDK的下面包含(函数(d))的
{var js,.
并在我的频道文件中运行我的应用程序。否则,某些部分不会加载。不确定这是否相关,但这很奇怪。正如所解释的,auth.authResponseChange
和auth.statuschange
在用户未登录时不会触发。当用户加载页面时,用户在e“未知”状态;但一旦调用FB.init时使用状态:true
,Facebook将检查登录状态并确定用户未登录-这也称为“未知”状态!从技术上讲,状态没有变化,因此不会调用状态变化回调。(这似乎是一个主要的API设计缺陷,特别是因为他们自己的示例代码不起作用。)
一种解决方案是将FB.init
中的状态检查设置为false,而不是使用FB.getLoginStatus()手动检查状态,这是该问题的公认答案
以便我们自己响应。如果用户未登录,则订阅登录事件。如果用户已登录,那就太好了
这是我正在使用的代码。login()
和logout()
是我定义的函数,它们为登录和未登录状态呈现部分页面。logout()
显示登录按钮,而login()
显示用户特定信息
FB.init({
appId: '...',
channelUrl: window.location.protocol + '//' + window.location.host + '/channel.html',
status: false,
[... other settings ...]
});
FB.getLoginStatus(function(response) {
if (response.status === 'connected') {
login();
} else {
FB.Event.subscribe('auth.login', function(response) {
window.location.reload();
login();
});
logout();
}
});
注意
window.location.reload();
在用户最初未登录然后自己登录的情况下。这是为了避免类似的阻止帧…
错误,在我的情况下,http://
vshttps://
不匹配。请查看您的情况是否需要它。如果您仍然遇到阻止帧,请查看frame、 ..
错误,可能是由于您在Facebook中配置应用程序设置的方式造成的。请尝试放置http://localhost:8080/
作为“使用Facebook登录的网站”下的网站URL,并访问该网站以查看您的应用程序。您是在localhost上开发的吗?是的,事实上我是。我还收到多个阻止了一个带有源代码的框架"http://static.ak.facebook.com“从访问具有原点的帧”http://localhost。请求访问的框架将“document.domain”设置为“facebook.com”,但正在访问的框架未设置。两者都必须设置为“document.domain”“设置为相同的值以允许访问。
不确定这是否相关。请确保您的Facebook应用程序配置为指向localhost,并且您的Javascript初始化代码中没有任何语法错误(您发布的部分看起来很好).Hmm,环顾四周几天后仍然没有运气。我的init代码中唯一的其他代码部分是FB.init…它看起来与演示代码完全相同(上面更新了我的q)。我还尝试打开live模式并更改我的网站url。在这个线程中,底部的答案是我应该指定一个端口。你知道这是什么端口吗?我尝试了http://localhost:80/appname
但是运气不好。所以把它放在外部网站上?很抱歉,我帮不了你什么忙,我也是新手。:)哇,太好了!这是一个非常彻底的答案。在不久前发布了这个问题之后,我实际上已经想出了一个与您非常类似的方法,利用getLoginStatus和if/else案例。这确实是解决方案,我同意他们的设计很糟糕。但是,您是否认为您进一步解释了window.location.reload()
避免了阻止帧…
错误?它避免了我的错误:阻止了带有原点的帧”http://www.facebook.com“从访问具有原点的帧”https://s-static.ak.facebook.com。请求访问的帧具有“http”协议,正在访问的帧具有“https”协议.Protocols必须匹配。
我不确定它是否对您的有帮助。我将在后续问题中尝试解决这个问题。嗯。两种解决方案都不是(window.location.reload
或:8080
)已解决本例中的错误。当我尝试:8080
时,我得到错误:应用程序配置不允许给定URL。应用程序的设置不允许一个或多个给定URL。它必须与网站URL或画布URL匹配,或者域必须是应用程序域之一的子域。
但是,谢谢非常感谢你的两个建议!非常感谢。你知道阻止了一个帧…
错误是否是一个关键错误吗?还有其他方法可以避免http/不匹配吗?看看你是否对阻止的一个帧错误感兴趣。