Обнаружение, когда всплывающее окно "Загрузка файла" закрыто
У меня есть веб-страница (сделанная с помощью JSF), где некоторые ссылки позволяют пользователю получить файл PDF.
Когда пользователь нажимает на такую ссылку, отображается всплывающее окно ожидания (это модальная панель) (поскольку создание PDF-файла может занять много времени), и после создания файла IE отображает всплывающее окно "Загрузка файла", в котором предлагается Опции "Открыть", "Сохранить" и "Отмена".
Есть ли способ в Javascript узнать из моей веб-страницы, когда это всплывающее окно закрыто, то есть когда пользователь сохранил (или открыл) файл PDF?
Чтобы быть более точным, на веб-странице, которая отображает ссылку на файл PDF, отображается модальное всплывающее окно ("ожидающее всплывающее окно"), чтобы заставить пользователя ждать всплывающее окно "Загрузка файла". Проблема заключается в том, что когда пользователь сохраняет (или открывает) файл PDF, всплывающее окно "Загрузка файла" закрывается, но затем пользователь "возвращается" на исходную веб-страницу, при этом всплывающее окно ожидания все еще отображается.
Обратите внимание, что мое приложение работает только в IE6, поэтому я не против решения IE-6-only...
У меня также нет проблем с решениями, которые нуждаются в jQuery;)
Редактировать: если существует решение для перехвата любого события, которое происходит именно тогда, когда пользователю отображается всплывающее окно "Загрузка файла" (т. Е. До того, как пользователь выберет "Сохранить", "Открыть" или "Отмена"), для меня это тоже подойдет!
5 ответов
Я должен был работать над этим вопросом, над другим проектом. Я наконец нашел умное решение, как объяснено в другом вопросе Stackru.
Объяснение дано в следующем посте: http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser
Идея состоит в том, чтобы "просто" использовать cookie, чтобы определить, когда файл загружается.
Такое событие не существует. Вы должны принять другой подход, чтобы решить эту проблему.
- нацелить ссылку на скачивание на скрытый фрейм с именем (
target="myhiddeniframe"
) - при нажатии на ссылку для загрузки, покажите свой счетчик загрузки
- установить
onload
атрибут iframe для обратного вызова, который скрывает ваш счетчик
Чистый эффект: вы "вращаетесь" во время создания PDF-файла и "раскручиваете", когда появляется диалоговое окно "Загрузка файла" (в отличие от того, когда закрывается диалоговое окно "Загрузка файла").
- открытое окно ожидания
- выполнить AJAX-запрос, чтобы сгенерировать файл, возвращающий только прямой URL-адрес сгенерированного файла.
- в обратном вызове закройте всплывающее окно ожидания и перенаправьте на этот URL
Пример:
$('.generate_file_asynchronously').click(function(){
var url = $(this).attr('href');
show_loading_message();
$.get(url, function(file_url) {
hide_loading_message();
window.location.href = file_url;
});
return false;
});
Я очень уверен, что ответ будет отрицательным, если только вы не захотите рассмотреть какой-нибудь плагин ActiveX для браузера (в этом случае ответ все еще может быть нет...)
Все ответы, которые я прочитал здесь и в связанном вопросе о stackru и в других местах, решают только первую часть проблемы - время, необходимое серверу для подготовки файла. Вторая часть проблемы, а именно время, необходимое для фактического завершения загрузки файла на клиенте, не так тривиальна.
В нашем приложении мы придерживались следующего подхода. У нас уже есть механизм push-уведомлений, основанный на cometd (вы можете прочитать больше о cometd здесь: Что такое Cometd? Почему он используется и как с этим работать), но я полагаю, вы также можете использовать WebSockets или что-то подобное. Мы используем Java в фоновом режиме, но это может быть что угодно. Так:
- Клиент инициирует загрузку, отправляя флаг / токен, содержащий идентификатор пользователя и некоторые другие уникальные значения, которые зависят от приложения и загрузки. Скрывает кнопку загрузки.
- Сервер получает запрос, подготавливает файл для загрузки и запускает ответ, устанавливая соответствующие заголовки, как обсуждалось в других решениях (например, с использованием файла cookie).
- Клиент получает ответ, но не показывает кнопку, он просто знает, что сервер успешно создал файл и загрузка началась.
- Сервер знает, когда загрузка фактически заканчивается (потому что он находится в цикле, передающем файл на выход, как описано здесь: /questions/23212996/sobyitie-brauzera-kogda-zagruzhennyij-fajl-sohranyaetsya-na-disk/23213007#23213007). Когда сервер узнает, что файл завершил загрузку, он отправляет клиенту уведомление с токеном из шага 1, используя cometd.
- Клиент получает уведомление о завершении загрузки и снова показывает кнопку.