Fire Javascript код, когда загрузка заканчивается
Мне нужно обновить пару старых классических страниц ASP - search.asp
страница, которая предоставляет простую форму, которая затем публикуется на results.asp
стр. Одним из параметров формы на странице поиска является раскрывающийся список (<select
) для "формата". Если пользователь выбирает формат Excel, страница результатов просто устанавливает для Response.ContentType значение application/vnd.ms-excel
и добавляет заголовок размещения содержимого, чтобы задать имя файла и сделать его вложением. Вот и все: все зависит от того, как правильно отобразить html, и это, как правило, довольно хорошо.
Все это работает довольно хорошо, за исключением одной вещи. Причиной использования опции Excel является то, что в этом случае пользователи действительно хотят видеть до 10000 элементов или даже больше за один поиск. Они будут использовать Excel, чтобы сделать дополнительный анализ результатов. Таким образом, операция поиска обычно занимает чуть более минуты, и я не могу это изменить.
Пользовательский опыт в эту минуту не идеален. Мало того, что пользователь просто сидит там, почти не получая обратной связи, часто достаточно результатов, что страница переполняет буфер ответов. Это означает, что страница должна периодически обновляться, и, следовательно, файл начинает загружаться сразу же, но менеджер загрузки не может самостоятельно предоставить значимую обратную связь. Моя миссия - улучшить ситуацию.
Первый шаг - просто показать простую processing...
сообщение на странице поиска, когда форма отправляется, и я могу сделать это достаточно легко. На самом деле, он делал это уже для опции формата "HTML". Проблема заключается в том, что при загрузке файла Excel я не знаю, как сказать что-либо о загрузке, поэтому я могу снова скрыть сообщение, а существующая реализация вообще не предоставляет никаких отзывов о ходе загрузки. Есть идеи? Если я могу просто заставить функцию javascript срабатывать после завершения загрузки, я могу подключить к этому практически все, но я пока не могу этого сделать.
Обновить:
Я переформулировал вопрос, чтобы попытаться представить проблему более четко.
4 ответа
Насколько я знаю, браузеры не предлагают вам никаких подсказок относительно того, как далеко продвинулась загрузка. Теоретически вы могли бы что-то сделать на стороне сервера и использовать AJAX для запроса к серверу, чтобы увидеть, сколько загрузки было отправлено, но я не знаю, как это сделать.
Хм, возможно ли будет сделать это через ajax? т. е. пользователь выбирает формат, запрос отправляется через ajax, и соответствующий документ загружается, например, в iframe в search.asp. затем вы можете получить успешное событие в вашем вызове ajax и соответствующим образом обработать сообщения.
Вы можете загрузить файл как вложение, добавив заголовок, чтобы браузер пользователя оставался работоспособным. Я понимаю, что это не совсем то, что вы просите; но если вы объедините это с промежуточной страницей, которую вы используете для версии HTML, это может улучшить пользовательский опыт.
Response.AddHeader "Content-Disposition", "attachment; filename=report.xls"
Пользователь увидит промежуточную страницу с графикой обработки, которая затем повторно отправит форму поиска. Это позволит отображать графическое изображение "Обрабатывается..." до тех пор, пока на странице не появится приглашение к загрузке файла Excel.
Обновление: я попытался использовать iframe, периодически проверяя объект документа на странице и перехватывая сообщение об ошибке "интерфейс не существует", когда он переключается в Excel, но он все еще блокирует браузер, пока документ Excel загружается в iframe. Я не думаю, что чистое решение JS будет работать. После этого я думаю, что следующий лучший путь - это (к сожалению) Flash. Удачи.
Я бы порекомендовал посмотреть, как модифицировать метод загрузки, чтобы использовать что-то вроде SWFUpload, что позволяет выполнять обратный вызов JavaScript в коде. После того, как файл загружен (при условии, что вы его сохраняете), я бы посмотрел, как передать имя файла и набрать его на странице Results.asp, где он затем получит его из хранилища файлов. Это не так безопасно, как хранить это в памяти, которую вы избегаете в своем вопросе; Тем не менее, это обеспечит лучший пользовательский опыт и может предоставить решение обратного вызова, которое вам нужно.
Вот пример подключаемого модуля jQuery, который упрощает процесс загрузки и интеграции SWFUpload: http://blog.codeville.net/2008/11/24/jquery-ajax-uploader-plugin-with-progress-bar/