Pull to refresh

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

Reading time1 min
Views18K

Проблема


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

$("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;
});


Другие способы решения пишите в комментариях.
Tags:
Hubs:
Total votes 34: ↑16 and ↓18-2
Comments22

Articles