Подтвердить что ты не робот

FB входной всплывающий блок

Я использую функцию входа в fb, но проблема, связанная со мной, заключается в том, что всякий раз, когда я нажимаю кнопку входа в fb до завершения загрузки медиафайла, он блокирует всплывающее окно для входа в fb, но если я нажму на fblogin после того, как секунда прошла событие загрузки, которое оно работает.

Вот функция, которую я использую:

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/, открывает всплывающие окна, которые никогда не блокируют всплывающее окно.

4b9b3361

Ответ 1

Вы не можете вызвать FB.login из обратного вызова FB.getLoginStatus.

Браузеры, как правило, блокируют всплывающие окна всплывающего окна, не генерируются как немедленный результат действия щелчка пользователя.

Поскольку FB.getLoginStatus выполняет вызов ajax, и вы вызываете FB.login в ответ, всплывающее окно, открывшееся в результате этого вызова, заблокировано.

Решение вашей проблемы состояло в том, чтобы вызвать FB.getLoginStatus на загрузку страницы и использовать ответ внутри вашего метода fb_login().

Ответ 2

Совершенно нормально вызывать FB.login из обратного вызова FB.getLoginStatus, если вы уверены, что статус входа уже загружен изнутри. Для этого используйте один из следующих вариантов:

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

Технически все эти опции используют FB.ui. Процесс асинхронности должен завершиться, что может занять несколько секунд. До тех пор, пока вы уже использовали один из вышеперечисленных методов для совершения междоменного вызова с помощью FB, и этот процесс асинхронности завершен, получение статуса входа не вызовет асинхронный вызов, и всплывающее окно не будет заблокировано.

Вы также должны не указывать true для второго параметра, как в FB.getLoginStatus(..., true);.

Ответ 3

Убедитесь, что вы установите статус на true, это устранит проблему блокировки всплывающих окон.

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

Ответ 4

У меня была та же самая проблема, и она ударила головой в течение 3 дней. Я наткнулся на вышеупомянутые решения, и они работали в Firefox и Edge, но в Chrome неважно, что бы я ни делал, я все еще блокировался влево и вправо. Другая проблема заключалась в том, что я вызвал функцию из кнопки, нажав кнопку входа в систему не был блоком, но он не получил никаких ответов после того, как диалог входа в систему закрывается для дальнейших действий, поэтому я застрял. Поэтому мое решение выполняется следующим образом, но вам не нужно нажимать кнопку входа в систему, чтобы он перенаправлялся на страницу входа в FB без нажатия кнопки, и по возвращении продолжайте все остальные шаги 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);

            });
        }