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