Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么FBAsyninit/fb.Event.subscribe中的其他情况不起作用?_Javascript_Facebook_Facebook Graph Api_Facebook Javascript Sdk - Fatal编程技术网

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://
vs
https://
不匹配。请查看您的情况是否需要它。如果您仍然遇到
阻止帧,请查看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/不匹配吗?看看你是否对阻止的一个帧错误感兴趣。