FB.Event.subscribe不起作用

时间:2013-02-19 10:12:42

标签: javascript html facebook-graph-api facebook-javascript-sdk

我正在网站上工作,希望为我的用户提供使用facebook登录的选项 我成功登录,但事件对我不起作用。

每当我登录时,都没有调用“登录”功能.....我已经尝试将此登录功能分配给其他按钮以手动检查,警报有效,但没有得到任何响应。

我的代码在这里:

<div id="fb-root"></div>
<script type="text/javascript">
window.fbAsyncInit = function() {
   FB.init({appId: MY_APP_ID, status: true, cookie: true, xfbml: true});

   FB.Event.subscribe('auth.login', function(response) {
      login();
     });
};

 function login(){
    FB.api('/me', function(response) {
   alert('You have successfully logged in, '+response.name+"!");
  }); 
 }

 (function() {
   var e = document.createElement('script');
   e.type = 'text/javascript';
   e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
   document.getElementById('fb-root').appendChild(e);
 }());     </script>

<fb:login-button autologoutlink='true'   
  perms='email,user_birthday,status_update,publish_stream'></fb:login-button>


这是facebook应用程序设置:
enter image description here

2 个答案:

答案 0 :(得分:1)

您是否尝试在<head>而不是#fb-root中加载all.js脚本?使用以下内容:

  (function(d){
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/es_LA/all.js";
     d.getElementsByTagName('head')[0].appendChild(js);
   }(document));

而不是:

 (function() {
   var e = document.createElement('script');
   e.type = 'text/javascript';
   e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
   document.getElementById('fb-root').appendChild(e);
 }());

[编辑:更新样本]

  

SDK将元素插入fb-root,期望相对定位     到身体或相对于靠近页面顶部的元素。

也可以替换SDK源 资源:Facebook Javascript SDK

-
你可以尝试订阅其他活动,看看它是否有效

FB.Event.subscribe('auth.statusChange', function(response) {
  // do something with response
});

来自Facebook文档(尝试订阅此代码)

  

<强> auth.authResponseChange
     任何与auth相关的更改都会触发此事件,因为它们都会影响会话:登录,注销,会话刷新。只要用户使用您的应用程序,会话就会随着时间的推移而刷新。

     

<强> auth.statusChange
      通常,您需要使用auth.authResponseChange事件。但在极少数情况下,您希望区分这三种状态:
      1.已连接
      2.登录Facebook但未与您的应用程序连接
      3.根本没有登录Facebook。

答案 1 :(得分:0)

场景1(新用户)

Facebook登录按钮的文字:“登录”
用户状态:用户未连接

现在用户点击登录并完成登录流程。

按钮的文字更改为“退出”,这是'auth.login'触发的唯一时间。

FB.Event.subscribe('auth.login', function (response) {     
        // do something with response                   
        if (response.status === 'connected') {
            // user connected                        
            FB.api('/me', function (response) {
                alert(response.name + " " + response.id);
            });
        }
});

场景2(现有用户)

如果登录Facebook且已经授权您的应用的用户访问您的应用,则用户会自动连接并且登录按钮的文本为“退出”。
在这种情况下,请将以下代码添加到fbAsyncInit function

            FB.getLoginStatus(function (response) {
                if (response.status === 'connected') {
                    // connected
                    alert(response.name + " " + response.id);
                }
            });
每次页面刷新时都会调用

FB.getLoginStatus,但您也可以通过将其嵌入到javascript函数中随时在应用中调用它。