2013-05-15 29 views
26

私はfbログイン機能を使用していますが、問題は、ページのメディア読み込みが完了する前にfbログインボタンをクリックするたびにfbログインのポップアップをブロックしますが、後でfbloginをクリックするとfbログインポップアップブロック

function fb_login() { 
var email=''; 
console.log(loginClassbackQueue); 
// console.log('user wants to login with fb'); 
FB.getLoginStatus(function(response) { 
    if(response.status!='connected'){ 
     FB.login(function(response) { 
      // console.log(response); 
      if (response.authResponse) { 
       // console.log('user logged in successfully'); 
       // console.log(response); 
       email = update_f_data_login(response); 
       $('#fb_login_popup, #popup_overlay').hide(); 
       // loginme(email); 
       } 
      else { 
        loginClassbackQueue = []; 
       // console.log('user failed to login'); 
       } 
       // console.log('fb login completed successfully'); 
      }, {scope:"email,user_birthday,user_likes,user_location,friends_likes,publish_actions"} 
     ); 
     } 
    else{ 
    // console.log('logged in and connected'); 
    email = update_f_data_login(response); 
    $('#fb_login_popup, #popup_overlay').hide(); 
    } 

}); 

} 

同じアクションをそれ開いたポップアップを常にポップアップをブロックすることはありませんhttp://fab.com/私はこのサイト上で行うとき:それはここでは

の作品ロードイベントに渡された二つ目は、私が使用しています機能です。

答えて

48

FB.loginは、コールバックのFB.getLoginStatusから呼び出すことはできません。

ブラウザがポップアップのポップアップウィンドウをブロックする傾向があるのは、ユーザーのクリック操作の即時の結果として生成されません。

FB.getLoginStatusajaxコールを行い、あなたがそれにFB.loginを呼び出す応答だ、この呼び出しの結果として開いてしまうポップアップがをブロックされているので。

問題を解決するには、ページロード時にFB.getLoginStatusに電話し、fb_login()メソッド内で応答を使用することです。

+0

に応じてそこ調整からその論理だが、今のおかげ –

+0

うんその作業素晴らしい..私はそれを試してみましょう感謝:) –

+1

ソリューションのみ作品ページが読み込まれたときにユーザーがFacebookにログインしている場合。それ以外の場合は失敗します。 –

34

それは限り、あなたはログインステータスが既に内部をロードされていることを確信しているとして、FB.getLoginStatusのコールバックからFB.loginを呼び出すために完全に罰金です。これを行うには、これらのいずれかを使用します。

  • FB.init({..., status: true, ... })
  • FB.ui(...)

  • FB.login(...)
  • FB.getLoginStatus(...)
  • は、技術的には、これらのオプションのすべてが FB.uiを使用しています。非同期処理が完了するまで数秒かかる場合があります。上記の方法のいずれかを使用してFBとのクロスドメインコールを行い、非同期プロセスが完了していれば、ログイン状態を取得しても非同期呼び出しは行われず、ポップアップはブロックされません。

    またFB.getLoginStatus(..., true);のように、二番目のパラメータのためのtrueを指定してくださいないすべきです。

    +6

    私はこれが正しい解決策としてマークされるべきだと思います。 –

    +0

    ありがとう@AndrewF私の人生を保存しました –

    +0

    FB.getLoginStatus(...、true)の2番目のパラメータをtrueに設定すると、デスクトップChromeでポップアップブロッカーが呼び出されます。キャッシュを強制するためのURLコールバックログイン(たとえば、Chrome iOSのFacebookログイン用)の特別な手渡しの場合にのみ使用してください。 – morph85

    9

    は、あなたがこの固定しますポップアップブロッカーの問題、真状態を設定していることを確認します。

    window.fbAsyncInit = function() { 
        FB.init({ 
        appId  : '{your-app-id}', 
        cookie  : true, // enable cookies to allow the server to access 
             // the session 
        xfbml  : true, // parse social plugins on this page 
        version : 'v2.5', // use graph api version 2.5 
        status  : true // set this status to true, this will fixed popup blocker issue 
        }); 
    
    +1

    これは私のために働いています...ステータスオプションのドキュメントはそれを示していますユーザの現在のログインステータスすべてのページの読み込み時に新しく取得されます。これを無効にすると、.getLoginStatus()を使用してそのステータスを手動で取得する必要があります。デフォルトはfalseです。 私はそれが実際に何をしているかについてちょっと考えました...ユーザーがfbにログインしているかどうかにかかわらず動作します... – Rishabh

    0

    私は同じ問題を抱えており、3日間頭を蹴っています。私は上記の解決策につまらないし、彼らはFirefoxとEdgeで働いていたが、クロムの中で私はまだ私はまだ右とcenter.Theボタンを押したイベントからログインダイアログブロックされていませんでしたが、ログインダイアログがさらにアクションを完了した後に応答が得られなかったので、私は立ち往生しました。ですから、私の解決策は次のようになりますが、ボタンを押してログインする必要はありません。FB-loginページにリダイレクトされ、他のすべてのsdkステップに戻ります。ちょうどあなたのコードにこれを追加し、それが助けかどうかを確認、あなたの必要性

    function statusChangeCallback(response) { 
          console.log('statusChangeCallback'); 
          console.log(response); 
    
    
          // The response object is returned with a status field that lets the 
          // app know the current login status of the person. 
          // Full docs on the response object can be found in the documentation 
          // for FB.getLoginStatus(). 
          if (response.status === 'connected') { 
           // Logged into your app and Facebook. 
           document.getElementById('Image2').style.display = "none"; 
           document.getElementById('mail').style.display = "in-line"; 
    
           testAPI(); 
          } else { 
           // The person is not logged into your app or we are unable to tell. 
           window.alert("Faça login no facebook antes de continuar - Obrigado"); 
           window.location.href = 'https://www.facebook.com/dialog/oauth' + 
           '?client_id=55215442252214521548' + 
           '&scope=public_profile,email,user_friends' + 
           '&redirect_uri=' + encodeURIComponent(document.URL); 
           document.getElementById('Image2').style.visibility = "hidden"; 
           document.getElementById('mail').style.display = "in-line"; 
    
          } 
         } 
    
         // This function is called when someone finishes with the Login 
         // Button. See the onlogin handler attached to it in the sample 
         // code below. 
         function checkLoginState() { 
          FB.getLoginStatus(function (response) { 
           statusChangeCallback(response); 
    
          }); 
         }