Facebook 提示fb登录,而不仅仅是显示登录按钮

Facebook 提示fb登录,而不仅仅是显示登录按钮,facebook,facebook-graph-api,facebook-javascript-sdk,Facebook,Facebook Graph Api,Facebook Javascript Sdk,我读过很多不同的文章,看到过一些检查fb登录状态的示例。我有一个从这些教育资源构建的工作页面 然而,我的问题是,我是否可以直接切换到登录提示,让用户不用点击登录按钮 目前,我在一个div中有一个Login按钮并隐藏: <div id="fblogin"> ....... class="fb-login-button" onlogin="afterFbLogin()" data-show-faces="false" data-width="200"

我读过很多不同的文章,看到过一些检查fb登录状态的示例。我有一个从这些教育资源构建的工作页面

然而,我的问题是,我是否可以直接切换到登录提示,让用户不用点击登录按钮

目前,我在一个div中有一个Login按钮并隐藏:

<div id="fblogin">
   .......
   class="fb-login-button"
   onlogin="afterFbLogin()"
   data-show-faces="false"
   data-width="200"
   data-max-rows="1"
   data-scope="publish_stream">
   ........
</div>
为了#2。fb sdk加载登录按钮(当上面的init检测到未登录时),如下所示,但如果我对此进行编码(在javascript中找到此元素并执行单击),facebook更改其sdk,则我的代码可能会中断

<div tabindex="0" class="pluginFaviconButton pluginFaviconButtonEnabled pluginFaviconButtonMedium" id="u_0_0" role="button">

因此,对于第1步的任何输入以及如何使用sdk完成第2步的任何想法,我们都将不胜感激


谢谢

我认为向前推进的最好方法是,只要使用一个变量,在facebook初始化后立即查看并获取用户的登录状态,然后使用该变量设置一个布尔变量,以确定是立即登录还是共享

所以让我们一步一步地看一下:


loggedIn变量 首先,我们要声明bool,以便能够访问它,并在默认情况下将其设置为false。你可能想把这个放在脑袋里的某个地方

var loggedIn = false;

原始Facebook初始化模板 接下来,让我们来看看基本的脸谱网init模板(如果你使用不同的东西,请告诉我):

我们将使用以下功能检查用户的登录状态:

// See if the User is logged in
FB.getLoginStatus(function(response) {
    if (response.status === 'connected')
    {
        // Mark the user as logged in
        loggedIn = true;
    }
});

共享前测试loggedIn 我不知道你在facebook上共享的代码是什么样子的,但让我们假设你把它放在一个名为
fbShare()
的函数中。我们现在可以做的是将
tryShare()
的onclick函数分配给您的共享按钮,并使用如下逻辑定义该函数:

function tryShare()
{
    if (loggedIn)
    {
        //User is already logged in and authorized
        fbShare();
    }
    else
    {
        // Pop open the FB Login dialog
        FB.login(function(response) {
            if (response.authResponse) {
                // Successful login/auth
                fbShare();
            }
            else
            {
                // Your user didn't want to log in to fb
            }
        });
    }
}

总结 因此,您的代码最终应该如下所示:

<head>
...
<script ... >
...
function fbShare()
{
    // Your sharing code goes here
}

var loggedIn = false;

function tryShare()
{
    // tryShare() function immediately above this..
}
</head>
<body>
<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        // init the FB JS SDK
        FB.init({
            appId      : 'YOUR_APP_ID',                        // App ID from the app dashboard
            channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel file for x-domain comms
            status     : true,                                 // Check Facebook Login status
            xfbml      : true                                  // Look for social plugins on the page
        });

        // Additional initialization code such as adding Event Listeners goes here
        
        // See if the User is logged in
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected')
            {
                // Mark the user as logged in
                loggedIn = true;
            }
        });
    };

    // Load the SDK asynchronously
    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
</script>
...
<button onclick="tryShare()">Share on Facebook</button>

...
...
函数fbShare()
{
//你的共享代码在这里
}
var loggedIn=假;
函数tryShare()
{
//紧靠此..上方的tryShare()函数。。
}
window.fbAsyninit=函数(){
//初始化FBJSSDK
FB.init({
appId:'您的应用程序\ ID',//应用程序仪表板中的应用程序ID
channelUrl:'//WWW.YOUR_DOMAIN.COM/channel.html',//用于x域通信的通道文件
状态:true,//检查Facebook登录状态
xfbml:true//在页面上查找社交插件
});
//附加的初始化代码(如添加事件侦听器)如下所示
//查看用户是否已登录
FB.getLoginStatus(函数(响应){
如果(response.status===“已连接”)
{
//将用户标记为已登录
loggedIn=true;
}
});
};
//异步加载SDK
(功能(d、s、id){
var js,fjs=d.getElementsByTagName[0];
if(d.getElementById(id)){return;}
js=d.createElement;js.id=id;
js.src=“//connect.facebook.net/en_US/all.js”;
fjs.parentNode.insertBefore(js,fjs);
}(文档“脚本”、“facebook jssdk”);
...
在Facebook上分享

除了
tryShare()
之外,大多数代码都是直接从中复制的。让我知道这一切是否有意义:)

这是一个有点愚蠢的问题。FB.init在页面加载时自动运行(不确定这是如何发生的,但确实发生了)。如果我第二次运行它,我会在调试控制台中得到一个关于它已经运行/加载的错误。我看到一些人说使用FB。_initialized=false;然后重新运行,但我不确定你是这么想的。我已经用代码片段编辑了我的OP,如果它们对您了解我做错了什么有价值的话。@user1278561根本不是一个愚蠢的问题:)这实际上完全是我的错,因为我给出了一个糟糕的答案(我可以看出“do fb init”怎么可能有点不清楚lol)。我更新/更改了我的答案,因为我最初的解决方案不是一个好的解决方案,即使它会被清楚地传达出来。lol。让我知道新答案是否有效/有意义:)
// See if the User is logged in
FB.getLoginStatus(function(response) {
    if (response.status === 'connected')
    {
        // Mark the user as logged in
        loggedIn = true;
    }
});
function tryShare()
{
    if (loggedIn)
    {
        //User is already logged in and authorized
        fbShare();
    }
    else
    {
        // Pop open the FB Login dialog
        FB.login(function(response) {
            if (response.authResponse) {
                // Successful login/auth
                fbShare();
            }
            else
            {
                // Your user didn't want to log in to fb
            }
        });
    }
}
<head>
...
<script ... >
...
function fbShare()
{
    // Your sharing code goes here
}

var loggedIn = false;

function tryShare()
{
    // tryShare() function immediately above this..
}
</head>
<body>
<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function() {
        // init the FB JS SDK
        FB.init({
            appId      : 'YOUR_APP_ID',                        // App ID from the app dashboard
            channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel file for x-domain comms
            status     : true,                                 // Check Facebook Login status
            xfbml      : true                                  // Look for social plugins on the page
        });

        // Additional initialization code such as adding Event Listeners goes here
        
        // See if the User is logged in
        FB.getLoginStatus(function(response) {
            if (response.status === 'connected')
            {
                // Mark the user as logged in
                loggedIn = true;
            }
        });
    };

    // Load the SDK asynchronously
    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
</script>
...
<button onclick="tryShare()">Share on Facebook</button>