提示fb登录不只是显示登录按钮

问题描述:

我已经阅读了许多不同的文章和看到样本,检查fb登录状态。我有从这些教育资源建立的工作页面。提示fb登录不只是显示登录按钮

但是,我的问题是,如果我可以直接切换到登录提示保存用户不必点击登录按钮。

目前我有一个div登录按钮和隐藏:

<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> 

目前FB.Init运行在页面加载和检查的登录状态,并显示在div如果需要的话。然后用户点击登录按钮....然后登录后必须点击共享按钮,这是我猜。

但是我希望有一个稍微不同的流量。

  1. 在页面加载时我不希望fb.init显示登录按钮。

  2. 当他们点击共享按钮,然后检查隐藏字段的值。如果他们在正常情况下在后台登录。如果不能直接跳转到登录提示。

因此为#1。我只是改变了FB.getLoginStatus if/then/else分支为not_authorized和unknown来设置隐藏输入类型的值。

FB.getLoginStatus(function (response) { 

    if (response.status === 'connected') 
    { 
     ....code.... 
    } 
    else if (response.status === 'not_authorized') 
    { 
     document.getElementById('FbLoginStatus').value = 'not_authorized'; 
    } 
    else 
    { 
     document.getElementById('FbLoginStatus').value = 'unknown'; 
    } 
}); 

对于#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可变

首先我们要声明布尔,所以我们可以访问它,并将它设置为false默认。你可能会想把它放在头部的某个地方。

var loggedIn = false; 


原始Facebook的初始化模板

接下来,让我们来看看基本的Facebook的init模板(让我知道如果你使用一些不同):

<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 
    }; 

    // 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> 


将F B.getLoginStatus()

以下行后:

// 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; 
    } 
}); 


测试的loggedIn共享之前

我不知道你的shar代码是什么在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> 

此代码的大多数除了tryShare()直接从Facebook JavaScript SDK Reference复制。让我知道如果这一切都有道理:)

+0

这里有一个愚蠢的问题。 FB.init在页面加载时自动运行(不知道这是怎么发生的,但它确实如此)。如果我再次运行它,我会在调试控制台中看到它已经被运行/加载的错误。我看到一些人说使用FB._initialized = false;然后重新运行它,但我不确定那是你在想什么。我已经用代码片段编辑了我的OP,如果它们对于我看到我做错了什么有任何价值。 – GPGVM

+0

@ user1278561根本不是一个愚蠢的问题:)它实际上完全是我的错,因为我给了一个可怕的答案(我可以看到“做fb init”可能有点不清楚lol)。我更新/更改了我的答案,因为即使它已经清楚地传达了大声笑,我的初始解决方案也不是很好。让我知道,如果新的答案有效/有意义或不:) – asifrc