提示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如果需要的话。然后用户点击登录按钮....然后登录后必须点击共享按钮,这是我猜。
但是我希望有一个稍微不同的流量。
在页面加载时我不希望fb.init显示登录按钮。
当他们点击共享按钮,然后检查隐藏字段的值。如果他们在正常情况下在后台登录。如果不能直接跳转到登录提示。
因此为#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复制。让我知道如果这一切都有道理:)
这里有一个愚蠢的问题。 FB.init在页面加载时自动运行(不知道这是怎么发生的,但它确实如此)。如果我再次运行它,我会在调试控制台中看到它已经被运行/加载的错误。我看到一些人说使用FB._initialized = false;然后重新运行它,但我不确定那是你在想什么。我已经用代码片段编辑了我的OP,如果它们对于我看到我做错了什么有任何价值。 – GPGVM
@ user1278561根本不是一个愚蠢的问题:)它实际上完全是我的错,因为我给了一个可怕的答案(我可以看到“做fb init”可能有点不清楚lol)。我更新/更改了我的答案,因为即使它已经清楚地传达了大声笑,我的初始解决方案也不是很好。让我知道,如果新的答案有效/有意义或不:) – asifrc