Мне нужно кросс-браузерное решение для следующего использования: Пользователь нажимает кнопку «Экспорт» на одной из наших страниц, которая открывает всплывающее окно с формой. При отправке формы пользователь должен получить загрузку бинарного файла (например, файл CSV), и всплывающее окно должно закрываться без изменения видимого содержимого родительского окна.Как обеспечить (в IE и Firefox) загрузку бинарного файла во всплывающем окне, которое закрывается?
Мы не можем использовать тайм-аут, чтобы закрыть всплывающее окно, потому что обычно существует диалоговое окно с запросом пользователя о том, как обрабатывать файл перед его загрузкой, и нет способа узнать, сколько времени потребуется пользователю для обработки этого диалога ,
Первоначально у нас был скрипт в popup, который устанавливает window.location в URL-адрес файла загрузки. Это оставляет всплывающее окно закрытым.
Итак, я попробовал поместить скрытый iFrame в родительское окно, а всплывающее меню установило src iFrame на URL-адрес загрузки перед вызовом self.close(). Это отлично работает в Firefox, но IE полностью справляется с ограничениями безопасности.
Есть ли правильный способ сделать это? Как насчет способа работы с IE?
Update - проблема решена
Ответы, предложенные здесь не были слишком далеко, но моя проблема была немного сложнее, чем просто вопрос 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».
будет ли оно работать, чтобы либо поместить форму на исходную страницу, либо открыть новую страницу для открытия в iframe (который может быть создан из самого скрипта)? – Anonymous
В ответ на Аноним - я думаю, что вы описываете, это то, что я сделал. Всплывающее окно при создании и начальной загрузке фактически записывает невидимый iFrame на родительскую страницу. Когда форма отправляется во всплывающее окно, она направляет iFrame для загрузки файла загрузки. Мой IE (IE 6) заблокировал это и заставил меня подтвердить загрузку в родительском окне. При подтверждении он пытается повторно отправить родительскую форму окна, которая вызывает другое диалоговое окно подтверждения и, как правило, испортит его. –
Я подумывал представить форму iframe, которая избавляется от затяжной всплывающей проблемы. – Anonymous