Проблема
Браузеры по политике безопасности разрешают открывать всплывающее окно, только, если пользователь непосредственно предпринял для этого какие-то действия. Например, этот код будет работать:
$("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;
});
Другие способы решения пишите в комментариях.