Подтвердить что ты не робот

Обнаружение, когда всплывающее окно "Загрузка файла" закрыто

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Мне пришлось работать над этой проблемой, в другом проекте. Наконец, я нашел умное решение, как описано в другом вопросе fooobar.com/questions/17539/....

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

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

Ответ 2

Нет такого события. Чтобы решить эту проблему, вам нужно принять другой подход.

  • укажите ссылку загрузки на скрытый iframe с именем (target="myhiddeniframe")
  • при щелчке ссылки для загрузки, покажите свою загрузку.
  • установите атрибут onload iframe для обратного вызова, который скрывает ваш spinner

Чистый эффект: вы "закручиваетесь", когда создается pdf, и "unspin", когда появляется диалоговое окно "Загрузка файла" (в отличие от того, когда диалог "Загрузка файла" закрыт).

Ответ 3

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

Ответ 4

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

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

  • Клиент инициирует загрузку отправки флага/токена, содержащего идентификатор пользователя и другое уникальное значение, которое является прикладным и загружаемым. Он скрывает кнопку загрузки.
  • Сервер получает запрос, подготавливает файл для загрузки и запускает ответ, устанавливая соответствующие заголовки, как описано в других решениях (например, с использованием файла cookie).
  • Клиент получает ответ , но не показывает кнопку, он просто знает, что сервер успешно создал файл и начал загрузку.
  • Сервер знает, когда загрузка фактически заканчивается (потому что она в потоковом потоке передает файл на выход, как описано здесь: fooobar.com/info/267698/...). Когда серверу известно, что файл завершил загрузку, он подталкивает уведомление клиенту с маркером с шага 1 с помощью cometd.
  • Клиент получает уведомление о завершении загрузки и показывает кнопку снова.