7

任何人都可以告訴我FB API的工作原理。 它看起來是一個基本的問題,但我真的很困惑。facebook API如何調用onlogin

問題: 我有onlogin()。當我點擊登錄按鈕時,我期待它調用這個函數。 但是在我粘貼的代碼中:我發現首先打印了alert-test,並且比FB.api被調用。

因此,它看起來像onlogin被稱爲第一,然後FB API ...有一種方法,我可以只調用一次這個函數。

<body> 
     <div id="fb-root"></div> 
<script> 

     window.fbAsyncInit = function() { 
      FB.init({appId: 'XXX', status: true, cookie: true, xfbml: true}); 

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

    function checkFacebookLogin() { 
    FB.api('/me', function(response) { 
     alert("Name: "+ response.name + "\nFirst name: "+ response.first_name + "ID: "+response.id); 
    }); 

    alert('test'); 

    } 

    </script> 


<p id="fb_login_button_1"><fb:login-button onlogin="checkFacebookLogin();" size="medium" scope="user_about_me">Sign in using Facebook</fb:login-button></p> 


</body>v 

我的主要問題是函數應該只調用一次....但它被調用兩次。

+0

'click'和'onclick'不會出現在你在你的問題有代碼,使得它難以解決的問題。 – Trott 2012-08-03 01:49:18

+0

感謝您指出它。我編輯了這個問題。 – 2012-08-03 02:19:12

回答

8
<body> 
     <div id="fb-root"></div> 
<script> 

     window.fbAsyncInit = function() { 
      FB.init({appId: 'XXX', status: true, cookie: true, xfbml: true}); 

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

    function fetchUserDetail() 
    { 
     FB.api('/me', function(response) { 
       alert("Name: "+ response.name + "\nFirst name: "+ response.first_name + "ID: "+response.id); 
      }); 
    } 

    function checkFacebookLogin() 
    { 
     FB.getLoginStatus(function(response) { 
      if (response.status === 'connected') { 
      fetchUserDetail(); 
      } 
      else 
      { 
      initiateFBLogin(); 
      } 
     }); 
    } 

    function initiateFBLogin() 
    { 
     FB.login(function(response) { 
      fetchUserDetail(); 
     }); 
    } 
    </script> 


<input type="button" value="Sign in using Facebook" onclick="checkFacebookLogin();"/> 


</body> 
+0

謝謝Purusottam,這解決了我的問題,它不打印2次。但我沒有看到FB彩色按鈕...一般人喜歡看那藍色的窗戶。因爲你正在使用「按鈕:類型我缺少那種外觀和感覺是可能的」fb:login-button「 – 2012-08-07 06:07:41

+0

使用CSS與FB按鈕具有相同的外觀和感覺如果這解決了你的問題,那麼將它標記爲回答,以便將來它可以幫助別人 – 2012-08-07 06:10:00

+0

它解決了..這是否意味着我不能直接使用FB apis :( – 2012-08-07 06:13:42

1

對FB API的請求調用是異步的。這意味着一旦發送請求,代碼就不會等待請求完成。因此,您可以在返回API調用之前獲得警報測試。所有的FB API調用都是異步的,如果你試圖讓它們同步,那麼你的瀏覽器就會掛起。

感謝 考希克

+0

謝謝Kaushik。我怎麼才能確保它只被稱爲一次..我明白,如你所說,如果我讓它同步它掛起..如何解決?爲什麼警報測試要求兩次。因爲它是異步的,所以只需要調用一次,然後等待FB響應呢?也請告訴我如何使它只有一次呼叫 – 2012-08-03 16:49:02

+0

嗨帕凡...爲什麼你使用FB.api來檢查用戶是否登錄或沒有。只需使用FB.login函數。其次爲什麼你使用fb:登錄按鈕?如果你使用這個,那麼你可能搞亂了FB Social插件。我的建議是簡單地創建HTML按鈕,然後點擊你的功能。有關更多詳情,請參閱此鏈接。 https://developers.facebook.com/docs/reference/javascript/FB.login/ – 2012-08-06 10:53:19

+0

非常感謝回覆。我正在查看用戶登錄的兩件事情,然後我想獲取登錄到我的數據庫的用戶的信息。因此,我使用FB.api。是的,它真的搞砸了按鈕。你可以讓我知道你的意思,以及如何使用它...我需要的是驗證應該由FB來完成,我想獲取用戶信息記錄....正如我在上面的例子中說的,它正在執行兩次..事實上,用戶信息的警報也打印兩次..我仍然不明白推理 – 2012-08-07 01:30:39