Вы можете сначала fill
массив с любым значением (например, undefined
), а затем вы сможете использовать map
:
var arr = new Array(2).fill().map(u => ({}));
var arr = new Array(2).fill().map(Object);
Вы не можете позвонить FB.login
из-за обратного вызова из FB.getLoginStatus
.
Браузеры, как правило, блокируют всплывающие окна, когда всплывающее окно не порождается как непосредственный результат действия пользователя, щелкающего мышью.
Поскольку FB.getLoginStatus
выполняет вызов ajax
, а вы отвечаете FB.login
на его ответ, всплывающее окно, которое открывается в результате этого вызова, заблокировано .
Решением вашей проблемы будет вызов FB.getLoginStatus
при загрузке страницы и использование ответа внутри вашего метода fb_login()
.
Совершенно нормально звонить FB.login
с помощью обратного вызова FB.getLoginStatus
, если вы уверены, что статус входа в систему уже был загружен внутри страны. Для этого воспользуйтесь одним из них:
FB.init({..., status: true, ... })
. FB.getLoginStatus(...)
FB.login(...)
FB.ui(...)
Технически все эти опции используют FB.ui
. Асинхронный процесс должен завершиться, что может занять несколько секунд. До тех пор, пока вы уже использовали один из методов выше, чтобы сделать междоменный вызов с FB, и этот асинхронный процесс завершен, получение статуса входа в систему не сделает асинхронный вызов, и всплывающее окно не будет заблокировано. ]
Также следует убедиться, что не указывает true
для второго параметра, как в FB.getLoginStatus(..., true);
.
Убедитесь, что вы установили status на 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
});
У меня была такая же проблема, и она била меня по голове в течение 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);
});
}