javascript - tag - fb bloque emergente de inicio de sesión
w3c article (4)
Asegúrate de establecer el estado en verdadero , esto solucionará el problema del bloqueador de ventanas emergentes.
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
});
Estoy haciendo uso de la función de inicio de sesión de fb, pero el problema es que cada vez que hago clic en el botón de inicio de sesión de fb antes de que se complete la carga de medios de la página, bloquea la ventana emergente de inicio de sesión de fb pero si hago clic en fblogin después de un segundo pasar al evento de carga trabajos
Aquí está la función que estoy usando:
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();
}
});
}
La misma acción cuando lo hago en este sitio http://fab.com/ abrir ventanas emergentes nunca bloqueará una ventana emergente.
Está perfectamente bien llamar a FB.login
desde la devolución de llamada de FB.getLoginStatus
, siempre que esté seguro de que el estado de inicio de sesión ya se ha cargado internamente. Para hacer esto, use uno de estos:
-
FB.init({..., status: true, ... })
. -
FB.getLoginStatus(...)
-
FB.login(...)
-
FB.ui(...)
Técnicamente, todas estas opciones usan FB.ui
El proceso asíncrono debe completarse, lo que podría demorar unos segundos. Siempre que haya utilizado uno de los métodos anteriores para realizar una llamada entre dominios con FB, y que el proceso asincrónico se haya completado, obtener el estado de inicio de sesión no hará una llamada asincrónica, y la ventana emergente no se bloqueará.
También debe asegurarse de no especificar true
para el segundo parámetro, como en FB.getLoginStatus(..., true);
.
No puede llamar a FB.login
desde la devolución de llamada de FB.getLoginStatus
.
Los navegadores tienden a bloquear las ventanas emergentes de la ventana emergente y no se generan como resultado inmediato de la acción de clic de un usuario.
Debido a que FB.getLoginStatus
realiza una llamada ajax
y usted llama a FB.login
en su respuesta, se bloquea la ventana emergente que se abriría como resultado de esta llamada.
Una solución a su problema sería llamar a FB.getLoginStatus
en la carga de página y usar la respuesta dentro de su método fb_login()
.
Tuve el mismo problema y me pateó la cabeza durante 3 días. Choqué con las soluciones mencionadas anteriormente y trabajaron en Firefox y Edge, pero en Chrome no importa lo que haya hecho, igual me bloquearon a la izquierda y al centro. El otro problema fue cuando llamé a la función desde un botón. no estaba bloqueado pero no obtuvo ninguna respuesta después de que el diálogo de inicio de sesión se cierra para otras acciones, así que me quedé atascado. Entonces mi solución es la siguiente, pero no es necesario presionar el botón de inicio de sesión para redirigir a la página de inicio de sesión de FB sin un evento de pulsación de botón, y al regresar continúe con todos los demás pasos de SDK. Simplemente agregue esto a su código y vea si ayuda, de allí ajuste de acuerdo a su necesidad
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);
});
}