Как обойти PopUp blocker в браузере в асинхронных запросах

в 6:13, , рубрики: chrome, Firefox, internet explorer, javascript, opera, браузеры, Веб-разработка, метки: , , , , , ,

Проблема

Браузеры по политике безопасности разрешают открывать всплывающее окно, только, если пользователь непосредственно предпринял для этого какие-то действия. Например, этот код будет работать:

$("someElement").on("click", function(){
    window.open("http://yandex.ru")
}


А теперь допустим, что нам надо сделать запрос к API, чтобы получить ссылку и только после этого открыть окно с этой ссылкой.
Таким образом, код уже не будет работать, тк окно уже открывается не по действию пользователя:

$.get("someURL").done(function(res){
    window.open(res);
});

Соответственно можно решить задачу так:
1. Заранее получить нужную ссылку, но в таком варианте отпадает возможность передачи каких либо параметров по действию пользователя для формирования ссылки
2. сделать запрос синхронным, что не вариант
3. подумать получше

Третий способ

А что, если открыть окно заранее с пустой ссылкой, для юзабилити и радости глаз нарисовать в окне индикатор загрузки, а после того как ссылка будет сформирована подменить location?

Пробуем, все работает.

Собственно небольшой кусочек кода:

 var win = window.open("", params)
//делаем красивости в win.document или втыкаем адрес открываем не пустую ссылку, а заранее заготовленную на сервере заглушку
$.get("someURL").done(function(res){
    win.document.location = res;
});

Другие способы решения пишите в комментариях.

Автор: ekubyshin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js