Я разрабатываю поток аутентификации OAuth исключительно на JavaScript и хочу показать пользователю окно «Предоставить доступ» во всплывающем окне, но оно блокируется.
Как я могу предотвратить всплывающие окна, созданные window.open
или window.showModalDialog
блокируемые всплывающими окнами в разных браузерах?
javascript
popup
modal-dialog
popup-blocker
Пабло Фернандес
источник
источник
Ответы:
Общее правило заключается в том, что блокировщики всплывающих окон включаются, если
window.open
или аналогичный код вызывается из JavaScript, который не вызывается прямым действием пользователя . То есть, вы можете позвонитьwindow.open
в ответ на нажатие кнопки, не блокируя всплывающие окна, но если вы добавите тот же код в событие таймера, он будет заблокирован. Глубина цепочки вызовов также является фактором - некоторые старые браузеры смотрят только на непосредственного абонента, новые браузеры могут немного откатить назад, чтобы увидеть, был ли вызывающий абонент щелчком мыши и т. Д. Держите его как можно более мелким, чтобы избежать блокировки всплывающих окон.источник
На основе Jason Sebring «S очень полезный совет , и на вещи , покрытые здесь и там , я нашел идеальное решение для моего случая:
Псевдокод с фрагментами Javascript:
немедленно создать пустое всплывающее окно на действие пользователя
Необязательно: добавьте некоторое «ожидающее» информационное сообщение. Примеры:
а) Внешняя HTML-страница: замените вышеуказанную строку на
б) Текст: добавьте следующую строку ниже приведенной выше:
заполните его содержимым, когда будете готовы (например, когда будет возвращен вызов AJAX)
Обогатите вызов
window.open
любыми дополнительными опциями, которые вам нужны.Я на самом деле использую это решение для перенаправления почты, и оно работает во всех моих браузерах (Windows 7, Android). Этот
_blank
бит помогает перенаправлению почты на мобильный телефон, кстати.Твой опыт? Есть ли способ улучшить это?
источник
Whatever it is you intend to do, there is a better way than a popup window
ржунимагу? Странное обобщение. Клиент хотел бы, чтобы страница, на которой он проходил аутентификацию, оставалась открытой, а новый сайт / целевая страница после аутентификации открывался в новой вкладке. Да, не мое представление о превосходном пользовательском опыте ... но это кажется разумнымimportantStuff.close
чтобы закрыть новую вкладку и предоставить уведомление на исходной странице.В дополнение к сообщению Swiss Mister, в моем случае window.open был запущен в обещании, которое включало блокировку всплывающих окон, мое решение было: in angular:
browserService:
это то, как вы можете открыть новую вкладку, используя ответ на обещание и не вызывая блокировщик всплывающих окон.
источник
const tab = window.open(); observable.subscribe(dataUrl => tab.location.href = dataUrl);
.then
ответ на этот вопрос, и поэтому я так растерялся: / SRY ...Как хорошая практика, я думаю, что это хорошая идея, чтобы проверить, было ли заблокировано всплывающее окно и принять меры в случае. Вы должны знать, что window.open имеет возвращаемое значение, и это значение может быть нулевым, если действие не выполнено. Например, в следующем коде:
если всплывающее окно заблокировано, window.open вернет ноль. Так что функция вернет false.
Если всплывающее окно не открывается, вы можете:
источник
из JavaScript API Google:
http://code.google.com/p/google-api-javascript-client/wiki/Authentication
Смотрите область, где написано:
Настройка аутентификации
Реализация OAuth 2.0 на клиенте использует всплывающее окно, чтобы предложить пользователю выполнить вход и одобрить приложение. Первый вызов gapi.auth.authorize может вызвать блокировку всплывающих окон, так как он косвенно открывает всплывающее окно. Чтобы запретить блокировку всплывающих окон при вызовах аутентификации, вызовите gapi.auth.init (callback) при загрузке клиента. Предоставленный обратный вызов будет выполнен, когда библиотека будет готова выполнить аутентификационные вызовы.
Я бы предположил, что это связано с реальным ответом выше, в том, как он объясняет, если есть немедленный ответ, он не отключит всплывающую тревогу. «Gapi.auth.init» делает так, чтобы API происходил немедленно.
Практическое применение
Я создал микросервис аутентификации с открытым исходным кодом, используя паспорт узла на npm и различные паспортные пакеты для каждого провайдера. Я использовал стандартный подход перенаправления к третьей стороне, предоставляя ей URL перенаправления для возврата. Это было программно, поэтому я мог иметь различные места для перенаправления обратно, если вход / регистрация и на определенных страницах.
github.com/sebringj/athu
passportjs.org
источник
Я пробовал несколько решений, но это единственное, которое действительно работает для меня во всех браузерах
let newTab = window.open(); newTab.location.href = url;
источник
url
? это не назначено.http://example.com
window.open()
нельзя открыть новое окно программно, и, если нам нужно, этот ответ является одним из вариантов. С помощьюnewTab
переменной, на которую мы ссылаемся,window.open()
и позже мы можем ее вызвать, вставить нужныйurl
нам, в моем случае, URL какого-то большого двоичного объекта, и новая вкладка будет открыта по введенному URL.Я не хотел создавать новую страницу, если обратный вызов не был успешно возвращен, поэтому я сделал это для имитации клика пользователя:
источник
Самый простой способ избавиться от этого - это:
Пример:
Это сработало очень хорошо для меня. ура
источник