Мне сложно определить решение проблемы, которая, как я думал, будет очень распространенной или прямой, чтобы решить, но, видимо, я ошибся.Как реализовать обратный вызов загрузки окна, когда контент имеет вложение Content Disposition?
Мне нужно переписать некоторый веб-код (который я не написал), что вызывает проблему. Когда пользователь нажимает на ссылку, запрос отправляется на веб-сервер, который, в свою очередь, извлекает или создает документ PDF откуда-то. Данные PDF возвращаются с заголовком Content-Disposition
, установленным на attachment
, и в браузере отображается диалоговое окно save-as.
Причина, по которой открывается диалог сохранения, заключается в том, что когда пользователь нажимает на ссылку, Javascript устанавливает window.location.href
на URL-адрес сервера (с некоторыми параметрами).
Нет анимации загрузки, отличной от той, которую браузер показывает на вкладке и т. Д. Во время обработки запроса.
Проблема заключается в том, что если запрос зависает или занимает некоторое время, пользователи, как правило, снова нажимают ссылку (возможно, несколько раз), что означает, что запросы на этот же ресурс просто продолжают наращивать работу на сервере (даже случайные двойные щелчки на ссылка, которые являются общими, заставляют обрабатывать два запроса).
Как я могу предотвратить это? Если я что-то вроде этого (с window.location.href
заменен window.open
:
var REQUEST_PENDING = false;
function getPDF(param1, param2) {
if (REQUEST_PENDING) return;
REQUEST_PENDING = true;
var w = window.open("/GetPdf.servlet?param1="+param1+"¶m2="+param2);
w.onload = function() {
DOC_REQUEST_PENDING = false;
}
}
... тогда только один запрос будет обработан в любое время, но OnLoad обратного вызова работает только если содержание возвращение HTML Когда это. приложение, которое у меня есть, переменная DOC_REQUEST_PENDING никогда не возвращается к false, поэтому дальнейшие запросы не могут быть сделаны.
Я знаю, что конечное решение, вероятно, должно быть реализовано на стороне сервера, но это невозможно для достижения того, что я пытаюсь сделать на стороне клиента (я могу использовать jQuery).
Одно возможно упрощенное решение: замените его на кнопку, которая отключается в методе 'getPDF'. Это предотвратит двойные щелчки в целом, и вы можете изменить текст кнопки на «Please wait ...» или что-то еще. К сожалению, заголовки, которые используются для принудительной загрузки, являются всего лишь механизмом, используемым браузером для этого и не имеют ничего общего с DOM. –
Вы также можете увидеть это: http://stackoverflow.com/questions/1106377/detect-when-browser-receives-file-download. Это решит вашу проблему, но это не простое решение. –
@Cory Но я бы подумал, что ответ, указывающий на вложение, не имеет значения, мне просто нужно обнаружить, что был ответ (любой вообще). Кроме того, меняется на кнопку не в той же ситуации. Мне все еще нужно обнаружить, что ответ пришел, чтобы я мог снова включить кнопку? – RTF