Есть ли способ определить начало загрузки в JavaScript?

В нашем текущем проекте мы обеспечиваем загрузку PDF-файла, который пользователь может настроить с помощью HTML-формы, которую он отправляет. Для динамического создания PDF-файла требуется несколько секунд, и я хотел бы это визуализировать, например отключив кнопку отправки, пока не начнется загрузка. К сожалению, я не смог найти способ определить, когда начинается загрузка *. Поэтому я бы не знал, когда снова включить кнопку отправки.

Я уже пытался указать IFrame в качестве цели моей HTML-формы, надеясь, что событие onload будет запущено. Однако это не так - вероятно, потому, что PDF-файл отправляется с заголовком «Content-disposition: attachment» и фактически не загружается в IFrame.

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

*) Позвольте мне прояснить это: мне не нужно было бы знать, была ли загрузка завершена или даже действительно ли она началась. Я хотел бы определить момент, когда браузер спросит пользователя, открыть или сохранить файл. Я предполагаю, что это происходит, когда браузер получает заголовок HTTP.

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

Prestaul 07.01.2009 17:15

Итак, вы отправляете форму, а ответом на это представление является файл PDF? Во время паузы браузер находится в режиме ожидания ответа от сервера? это правильно?

Breton 07.01.2009 17:16

@Breton: правильно! @Pretaul: я хотел бы знать, когда начнется загрузка. Итак, я мог создать временный файл, доставить некоторый HTML-ответ на скрытый IFrame, а затем получить временный файл с помощью JavaScript в обработчике загрузки.

cg. 07.01.2009 18:12

Я знаю, что вы уже приняли ответ на этот вопрос, но, возможно, вы захотите взглянуть на мое сообщение в блоге, посвященное именно этой проблеме: gruffcode.com/2010/10/28/…

Jesse Taber 14.02.2015 05:38

@Jesse Использование файлов cookie для этого - действительно отличная идея! Примерно на 6 лет опоздали для этого случая, но, возможно, будет полезно вспомнить. Спасибо за предупреждение.

cg. 16.02.2015 11:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
5
6 432
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы хотите иметь возможность определять, когда размер загруженного файла изменяется с 0 на положительное значение. Насколько я знаю, это невозможно сделать с помощью javascript - вам нужен плагин, который может получить доступ к файловой системе клиента.

Рекомендуемый обходной путь: создайте сеанс для каждой загрузки. Попросите клиента опросить сервер о статусе загрузки. Это могло быть «не существовало», «не началось», «началось», «закончилось». Вам потребуется некоторая работа на стороне сервера, чтобы сохранить и обновить статус загрузки, а также инфраструктуру AJAX.

Спасибо за Ваш ответ! Меня действительно не волнует фактическая загрузка (в файл), достаточно знать, когда будет получен заголовок ответа HTTP. Я еще не совсем уверен, что это невозможно сделать в javascript.

cg. 07.01.2009 18:44

Предложенная вами работа немного сложнее, чем то, что я искал. Но я думаю, это сработает, и это, безусловно, лучшая идея.

cg. 07.01.2009 18:47

Я все еще не совсем уверен, что есть лучшее решение. Но сейчас я реализовал идею сеанса / статуса, поэтому я приму этот ответ. Еще раз спасибо.

cg. 08.01.2009 14:02

Это решение лучше всего подходит для апплетов, потому что оно не требует смены апплета (что иногда может быть невозможно) и очень надежно (оно обнаруживает такие случаи, как запрос «разрешить java plugin» в браузере). Но, как недостаток, это требует дополнительной серверной службы.

setec 28.05.2014 11:39

Самым простым решением было бы оценить время (щедро) и сделать это таким образом. Это хитрость, но дает желаемый эффект. Другой вариант - отправить форму с обратным вызовом с помощью Ajax, чтобы отправить форму и заставить генератор возвращать детали на вызывающую страницу. http://www.jquery.com/ может быть хорошей отправной точкой для этого варианта.

Если бы я был вами, я бы сделал AJAX-вызов сервера с информацией, сгенерировал бы файл, а затем вернул бы имя файла / id / все что угодно обратно в javascript, который затем сделает window.location чем-то вроде download.php? Id = x (но файл уже был сгенерирован, поэтому он просто устанавливает заголовки и читает его), после чего вы можете повторно включить отправку.

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

cg. 08.01.2009 11:14

Ооо, мои извинения. Совершенно не видел этой части.

Paolo Bergantino 08.01.2009 20:33

Другие вопросы по теме