Хотя API предоставляет механизм для определения, когда пользователь нажимает кнопку «Запретить», нет встроенного способа для определения того, что пользователь внезапно закрыл всплывающее окно (или закрыл свой веб-браузер, выключил свой компьютер и т. Д.) . Условие Запретить предоставляется на тот случай, если вы хотите повторно запросить пользователя с ограниченными возможностями (например, вы запросили «электронную почту», но вам нужен только профиль, и вы позволите пользователю продолжить, не сообщая вам свой адрес электронной почты).
Если ответ обратного вызова для входа содержит ошибку access_denied
, это означает, что пользователь нажал кнопку «Запретить»:
function onSignInCallback(authResult) {
if (authResult['error'] && authResult['error'] == 'access_denied') {
// User explicitly denied this application's requested scopes
}
}
Вы должны иметь возможность реализовать вход, не определяя, было ли закрыто окно; это демонстрируется практически во всех примерах приложений Google+. Короче говоря, вам следует избегать использования счетчика, как вы это делаете, и вместо этого следует скрывать аутентифицированный пользовательский интерфейс до тех пор, пока пользователь не войдет в систему.
Не рекомендуется делать это, но чтобы реализовать обнаружение закрытия всплывающего окна, вы можете сделать что-то вроде переопределения глобального вызова window.open
, а затем определить в window.unload или опросить, было ли закрыто окно без аутентификации пользователя :
var lastOpenedWindow = undefined;
window.open = function (open) {
return function (url, name, features) {
// set name if missing here
name = name || "default_window_name";
lastOpenedWindow = open.call(window, url, name, features);
return lastOpenedWindow;
};
}(window.open);
var intervalHandle = undefined;
function detectClose() {
intervalHandle = setInterval(function(){
if (lastOpenedWindow && lastOpenedWindow.closed) {
// TODO: check user was !authenticated
console.log("Why did the window close without auth?");
window.clearInterval(intervalHandle);
}
}, 500);
}
Обратите внимание, что, поскольку я реализовал его, этот механизм ненадежен и зависит от условий гонки.
person
class
schedule
16.02.2016