У меня была такая же проблема, и она била меня по голове в течение 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);
});
}
Я ненавижу eval, и я не одинок :
var fn = window[settings.functionName];
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
Редактировать: В ответ на комментарий @ Mahan:
В этом конкретном случае settings.functionName
будет «clickedOnItem»
. Это во время выполнения переведет var fn = window [settings.functionName];
в var fn = window ["clickedOnItem"]
, что приведет к получению ссылки на функцию clickedOnItem (nodeId) {}
. Если у нас есть ссылка на функцию внутри переменной, мы можем вызвать эту функцию, «вызвав переменную», то есть fn (t.parentNode.id)
, что равно clickedOnItem (t.parentNode .id)
, что и требовалось OP.
Более полный пример:
/* Somewhere: */
window.settings = {
/* [..] Other settings */
functionName: 'clickedOnItem'
/* , [..] More settings */
};
/* Later */
function clickedOnItem (nodeId) {
/* Some cool event handling code here */
}
/* Even later */
var fn = window[settings.functionName];
/* note that settings.functionName could also be written
as window.settings.functionName. In this case, we use the fact that window
is the implied scope of global variables. */
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
window[settings.functionName](t.parentNode.id);
Нет необходимости в eval ()
JavaScript has an eval
function that evaluates a string and executes it as code:
eval(settings.functionName + '(' + t.parentNode.id + ')');
eval () - это функция, которая вам нужна для этого, но я бы посоветовал попробовать одну из этих вещей, чтобы свести к минимуму использование eval. Надеюсь, один из них будет иметь для вас смысл.
Сохранить функцию
Сохранить функцию как функцию, а не как строку, и использовать ее как функцию позже. Где вы на самом деле сохраните функцию, зависит от вас.
var funcForLater = clickedOnItem;
// later is now
funcForLater(t.parentNode.id);
или
someObject.funcForLater = clickedOnItem;
// later is now
(someObject.funcForLater)(t.parentNode.id);
Сохранить имя функции
Даже если вам нужно сохранить имя функции в виде строки, вы можете минимизировать сложность, выполнив
(eval(settings.functionName))(t.parentNode.id);
, который минимизирует количество Javascript вы должны создать и оценить.
Словарь обработчиков
Поместите все функции действий, которые могут вам понадобиться, в объект и назовите их в стиле словаря, используя строку.
// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };
// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);
(Незначительное примечание: если вместо этого здесь вы использовали синтаксис itemActions [actionName] (t.parentNode.id);
Если settings.functionName
уже является функцией, вы можете сделать это:
settings.functionName(t.parentNode.id);
В противном случае это также должно работать, если settings.functionName
просто имя функции:
if (typeof window[settings.functionName] == "function") {
window[settings.functionName](t.parentNode.id);
}
eval("javascript code");
он широко используется при работе с JSON .