3

我正在开发一个网站,并希望为我的用户提供使用 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 应用程序设置:
在此处输入图像描述

4

2 回答 2

1

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

  (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 中,这些元素期望相对于 body 或相对于靠近页面顶部的元素定位。

这也可能取代 SDK 源。
资源:Facebook Javascript SDK

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

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

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

auth.authResponseChange
任何与身份验证相关的更改都会触发此事件,因为它们都会影响会话:登录、注销、会话刷新。只要用户在您的应用中处于活动状态,会话就会随着时间的推移而刷新。

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

于 2013-02-19T11:11:39.913 回答
0

场景一(新用户)

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 函数中随时在应用程序中调用它。

于 2013-02-19T13:31:57.960 回答