обнаружение, когда всплывающее окно «Загрузка файла» закрыто - PullRequest
19 голосов
/ 20 марта 2009

У меня есть веб-страница (сделанная с помощью JSF), где некоторые ссылки позволяют пользователю получить файл PDF.

Когда пользователь нажимает на такую ​​ссылку, отображается всплывающее окно ожидания (это модальная панель) (потому что создание PDF может быть длинным), и как только файл создан, IE отображает «Загрузка файла» всплывающее окно, в котором предлагаются параметры «Открыть», «Сохранить» и «Отмена».

Есть ли способ в Javascript узнать с моей веб-страницы, когда это всплывающее окно закрыто, т.е. когда пользователь сохранил (или открыл) файл PDF?

Чтобы быть более точным, на веб-странице, которая отображает ссылку на файл PDF, отображается модальное всплывающее окно («ожидающее всплывающее окно»), чтобы заставить пользователя ждать всплывающее окно «Загрузка файла». Проблема заключается в том, что когда пользователь сохраняет (или открывает) файл PDF, всплывающее окно «Загрузка файла» закрывается, но затем пользователь «возвращается» на исходную веб-страницу с всплывающим окном ожидания.

Обратите внимание, что мое приложение работает только в IE6, поэтому я не против решения, основанного только на IE (6) ...

У меня также нет проблем с решениями, для которых требуется jQuery;)

Изменить: Если существует решение для перехвата любого события, которое происходит именно тогда, когда пользователю отображается всплывающее окно «Загрузка файла» (т. Е. До того, как пользователь выберет «Сохранить», «Открыть» или «Отмена»), для меня это тоже будет хорошо!

Ответы [ 5 ]

14 голосов
/ 13 июня 2012

Мне пришлось работать над этим вопросом, над другим проектом. Я наконец нашел умное решение, как объяснено в другом вопросе Stackoverflow .

Объяснение дано в следующем посте: http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser

Идея состоит в том, чтобы "просто" использовать cookie-файл, чтобы определить, когда файл загружается.

10 голосов
/ 20 марта 2009

Такое событие не существует. Вам нужно использовать другой подход, чтобы решить эту проблему.

  1. нацелить ссылку на скачивание на скрытый iframe с именем (target="myhiddeniframe")
  2. при нажатии на ссылку для загрузки, покажите свой загрузчик
  3. установить атрибут onload в iframe для обратного вызова, который скрывает ваш счетчик

Чистый эффект: вы «вращаетесь» во время создания PDF-файла и «разворачиваетесь», когда появляется диалоговое окно «Загрузка файла» (в отличие от того, когда диалоговое окно «Загрузка файла» закрыто ).

1 голос
/ 10 мая 2018
  • открытое всплывающее окно ожидания
  • do 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;
});
1 голос
/ 20 марта 2009

Я очень уверен, что ответ - нет, если только вы не хотите рассмотреть какой-нибудь плагин ActiveX для браузера (в этом случае ответ все еще может быть нет ...)

0 голосов
/ 29 июня 2016

Все ответы, которые я прочитал здесь и в связанном вопросе о stackoverflow и в других местах, решают только первую часть проблемы - время, необходимое серверу для подготовки файла. Вторая часть проблемы - время, необходимое для фактического завершения загрузки файла на клиенте, - не так тривиальна.

В нашем приложении мы придерживались следующего подхода. У нас уже есть механизм push-уведомлений, основанный на cometd (вы можете прочитать больше о cometd здесь: Что такое Cometd? Почему он используется и как работать с этим ), но я полагаю, вы также можете использовать WebSockets или что-то похожее. Мы используем Java в фоновом режиме, но это может быть что угодно. Итак:

  1. Клиент инициирует загрузку, отправляя флаг / токен, содержащий идентификатор пользователя и некоторые другие уникальные значения, которые зависят от приложения и загрузки. Скрывает кнопку загрузки.
  2. Сервер получает запрос, подготавливает файл для загрузки и запускает ответ, устанавливая соответствующие заголовки, как обсуждалось в других решениях (например, с использованием файла cookie).
  3. Клиент получает ответ , но не показывает кнопку , он просто знает, что сервер успешно создал файл и загрузка началась.
  4. Сервер знает, когда загрузка фактически заканчивается (поскольку он находится в цикле, передающем файл на выход, как описано здесь: https://stackoverflow.com/a/2343483/134120). Когда сервер знает, что файл завершил загрузку, он отправляет уведомление клиент с токеном из шага 1, использующий cometd.
  5. Клиент получает уведомление о завершении загрузки и снова показывает кнопку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...