Мне нужно кросс-браузерное решение для следующего варианта использования:
Пользователь нажимает кнопку «экспорт» на одной из наших страниц, которая открывает всплывающее окно с формой. При отправке формы пользователь должен получить загрузку двоичного файла (например, CSV-файл), и всплывающее окно должно закрыться без изменения видимого содержимого родительского окна.
Мы не можем использовать тайм-аут, чтобы закрыть всплывающее окно, потому что обычно есть диалоговое окно, спрашивающее пользователя, как обработать файл перед его загрузкой, и нет способа узнать, сколько времени потребуется пользователю для обработки этого диалога.
Изначально у нас во всплывающем окне был скрипт, который устанавливает в window.location URL-адрес загружаемого файла. Это оставляет всплывающее окно закрытым.
Итак, я попытался поместить скрытый iFrame в родительское окно и заставить всплывающее окно установить src iFrame на URL загрузки перед вызовом self.close (). Это прекрасно работает в Firefox, но IE полностью устраняет ограничения безопасности.
Есть ли правильный способ сделать это? Как насчет того, как это работает в IE?
Обновление - проблема решена
Ответы, предложенные здесь, были не слишком далеки, но моя проблема была немного сложнее, чем просто проблема с Javascript. Я столкнулся с ошибками в IE и Excel (поскольку загружаемый файл - CSV), а всплывающее окно делало пост в форме.
Я не смог решить проблему, не добавив данные формы в URL (для GET вместо POST), и мне пришлось установить сайт как надежный в IE (это корпоративное приложение, так что это разумный запрос сделать из пользователей).
При нажатии кнопки формы всплывающее окно вызывает функцию для window.opener, передавая форму и ее URL-адрес действия. Затем всплывающее окно вызывает window.close (). Функция добавляет данные формы к URL-адресу и задает window.location для нового URL-адреса (идея iFrame никогда не работала хорошо в IE и, видимо, в этом не было необходимости).
В ответе на URL формы заголовки запроса включают Content-Type: application / octetstream и Content-Disposition "," attachment; имя файла = filename.csv».