這是舊的,但我面臨着同樣的問題:使用簡單的自定義<button>
而不是「官」 FB按鈕時 ,登錄彈出窗口打開在屏幕的最右側。
我認爲官方按鈕(這很複雜:JS的完整html頁面)使用SDK來集中彈出窗口。我無法使用SDK將定製按鈕集中到彈出窗口中(如果有人這樣做,請告訴我們!)。 從自定義按鈕觸發時,FB.login()函數不會居中彈出窗口。
我發現這個解決方案,它的偉大工程: http://permadi.com/2011/04/centering-facebook-oath-login-popup-dialog/
在線演示(查看源代碼,看看代碼): http://www.permadi.com/tutorial/facebook-js-oauth-popup-centered/index.html
它利用FB.getLoginStatus的(),而不是的FB.login ()。 它模仿的FB.login功能:
- 打開與window.open
- 檢查在使用setInterval居中的Facebook彈出如果用戶登錄或不
- 當用戶與facebook完成後,開口期間提供的的redirectUrl彈出窗口被FB用來轉到我們用window.close()創建的空白頁面 - >它關閉彈出框
- clearInterval並繼續應用程序代碼(登錄,保存在數據庫中...)
下面是我 JQUERY版本的腳本的一些簡化和改進措施:
- 簡化:只能登錄按鈕。沒有註銷。
- 改良效果:加載JSK只有當用戶打FBlogin按鈕(而且只有一次)
- 改良效果:防止用戶觸發多個Facebook的彈出式窗口(重要)
我們種重建官方FB。在這裏登錄功能:) 但有過官方按鈕一些優勢:
- 我們可以用一個簡單的
<button>
至極是很容易的風格
- 至極的訪問(試圖抓住官方BTN與鍵盤上的TAB只)
至極加載速度快
var fbOpen = 0; // to prevent opening multiple facebook login popup dialog
// otherwhise setInterval is messing things around!
function treatFBresponse() {
FB.init({
appId : 'YOUR_APDD_ID',
status :true, // IMPORTANT, otherwhise if user cancel login (->response.status="unknown), 2nd time -> response.status="NULL" -> no possible login any more!
cookie : true,
version : 'v2.5'
});
FB.getLoginStatus(function(response) {
if (response.status=="connected" && response.authResponse){
FB.api('/me?fields=id,name,first_name,last_name,picture,email', function(response) {
// USER LOGGED into your app and facebook -> console.dir(response); -> log into your app, save in database etc.
}else{
// USER NOT LOGGED into your app
fbOpen = 0; // we let him retry
}
});
}
var gotFBscript = 0; // to load FB JS SDK only once
function fbSDK() {
// SDK NOT LOADED YET
if(!gotFBscript){
console.log('getting FB JS SDK...');
$.ajax({
// OR $.ajaxSetup({ cache: true });
// $.getScript('//connect.facebook.net/en_EN/sdk.js', function(){ gotFBscript = 1 ...
// BUT $.ajax is better I think because it lets you set cache to true locally
url: '//connect.facebook.net/en_EN/sdk.js',
dataType: "script",
cache:true,
success: function() {
gotFBscript = 1;
treatFBresponse();
}
});
// SDK ALREADY LOADED
}else if (gotFBscript){
treatFBresponse();
}
};
function facebookPopup() {
var popupWidth=500,
popupHeight=300,
xPosition=($(window).width()-popupWidth)/2,
yPosition=($(window).height()-popupHeight)/2,
loginUrl="http://www.facebook.com/dialog/oauth/?"+
"scope=public_profile,email&"+ // instead of publish_stream
"api_key=YOUR_APDD_ID&"+ // instead of client_id
"redirect_uri=http://www.MY_SITE.COM/path/to/self-closing-empty-page.php&"+
"response_type=token&"+
"display=popup",
fbLoginWindow=window.open(loginUrl, "LoginWindow",
"location=1,scrollbars=1,"+
"width="+popupWidth+",height="+popupHeight+","+
"left="+xPosition+",top="+yPosition),
loginTimer=setInterval(function() { checkLoginWindowClosure(fbLoginWindow, loginTimer), 1000);
};
function checkLoginWindowClosure(fbLoginWindow, loginTimer) {
if (fbLoginWindow.closed)
{
clearInterval(loginTimer);
fbSDK();
}
};
$("#YOUR_CUSTOM_FB_BUTTON").on('click', function() {
if(fbOpen === 0) {
fbOpen = 1;
facebookPopup();
}
});
您可以張貼在那裏,這是發生在測試環節? – luschn
@luschn我沒有服務器訪問服務器,所以我不能給測試鏈接......我也注意到,使用'時彈出工作正常......「任何方式使用自定義樣式在這? –
seadrag0n
你使用的是localhost嗎?無論如何,FB.login一般都能正常工作,不能將它集中在自己的afaik上。 – luschn