2011-11-22 51 views
2

我正在使用Facebook API嘗試和實施登錄。Facebook API - 必須刷新

我的問題是,當我通過鍵入XXXXXXX並點擊回車加載頁面時,頁面加載而不是Facebook登錄按鈕呈現,而是顯示「登錄到Facebook」。該按鈕不呈現,我沒有看到任何Javascript錯誤。

但是,當我按CTRL + R時,按鈕確實會加載

無論如何,我很快就會重新編寫整個PHP,AJAX和Javascript代碼,並使其更好(視圖控制器,安全認真的代碼等),但是當我這樣做時,有人可以幫助我確定上述問題的原因,以便我可以在下次避免這種情況。

步驟以重現此錯誤:

  1. XXXXXXX - 在沒有到Facebook
  2. 注意登錄瀏覽器的按鈕不加載
  3. 刷新頁面
  4. 注意按鈕確實加載

此外,我還想指出,我只是三再次執行這些步驟,並且必須多次刷新以獲取按鈕才能呈現。 XXXXXX似乎工作得很好,但我認爲代碼也非常相似。

回答

2

好像是裝在我結束精細,使用Chrome,即FF和Safari瀏覽器首先要獲得該顯示邏輯一致地工作。我會首先建議清理緩存。你也可以使用sdk的異步加載,然後在sdk加載後fbml解析呈現按鈕...


 <div id="loginbutton"></div> 
     <div id="fb-root"></div> 
<script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
    appId : 'yourAppId', 
    status : true, // check login status 
    cookie : true, // enable cookies to allow the server to access the session 
    xfbml : true, // parse XFBML 
    //channelUrl : 'http://WWW.MYDOMAIN.COM/channel.html', // channel.html file 
    oauth : true // enable OAuth 2.0 
     }); 
    // using xfbml parse in async to render button after sdk is download and init. 
    Cbuild1 = document.getElementById('loginbutton'); 
    Cbuild1.innerHTML = "<fb:login-button></fb:login-button>"; 
setTimeout("FB.XFBML.parse(Cbuild1)", 1100); 
    // 
     }; 
     (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
</script> 

enter image description here

+1

已經使用異步加載,但是在IE中,它確實看起來像當我刪除瀏覽器緩存,然後加載頁面似乎一切正常。我可以放在哪裏以防止用戶每次都必須刪除緩存? – Jimbo

+1

您是否將fbml.parse添加到異步?它會阻止按鈕在下載sdk之前嘗試渲染,或者從可能需要整理的硬盤上的緩存中提取按鈕。或者將按鈕包裝在一個函數中,並從異步中調用該函數。 –

+1

我做了,沒有什麼似乎改變了添加這三行。 – Jimbo

0

在內容div後面移動腳本塊。

3

如果您檢查與Chrome或Firefox,當顯示圖像的HTML,按鈕的div代碼如下所示:

<div id="login_div"><div class="fb-login-button"><a class="fb_button fb_button_medium"><span class="fb_button_text">Login with Facebook</span></a></div></div> 

然而,當它不顯示,它看起來像這樣:

<div id="login_div"><div class="fb-login-button">Login with Facebook</div></div> 

我看不到你所有的代碼,但我的猜測是FB代碼在執行你的div的代碼時遇到了一些計時問題。因此,您的div沒有正確設置,並且CSS無法應用相應的樣式(背景圖像,背景顏色)。我不能完全說出你在做什麼,但看起來你只是做了標準的if-logged-in-do-this-else-show-login-button。嘗試簡化您的Facebook登錄檢查代碼,如:

FB.getLoginStatus(function(response) { 
if (response.session) { 
    fb_user_logged = 1; 
    // Do or Show facebook authenticated stuff 
} else { 
    $("#login_div").html('<div class="fb-login-button"><a class="fb_button fb_button_medium"><span class="fb_button_text">Login with Facebook</span></a></div>'); 
} 

});

此外,您應該使用asynchronous version來解決這些時間依賴性。

最起碼,你可以你的東西你所有的邏輯之前,早在

+1

這並沒有解決我的問題,但我很欣賞的登錄密碼的建議,並加入到新的更新此。謝謝! – Jimbo

+1

想到我會補充說它最終確實是一個計時問題,如果可以的話,我會將你的答案也作爲接受的答案添加進來,謝謝。 – Jimbo

+2

沒問題。我也得到了間歇性的結果。這是一個計時問題,所以您需要簡化代碼以刪除同步依賴關係。 – scham

相關問題