GWT - самый простой способ сделать простой экран загрузки, пока файл не загружен - PullRequest
15 голосов
/ 18 февраля 2011

При нажатии кнопки мое приложение GWT возвращает внедренный в HTML-страницу файл PDF, который выглядит примерно так:

<html><head></head>
<body marginwidth="0" marginheight="0" bgcolor="rgb(38,38,38)">
<embed width="100%" height="100%" name="plugin"
    src="http://myserver/?cmd=getMyPdf" type="application/pdf">
</body>
</html>

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

Одним очевидным способом было быотобразить страницу загрузки, отправить асинхронную команду на сервер, а затем, после вызова метода onSucceed, вызвать страницу как обычно.Недостатком является то, что мне придется добавить некоторую логику на стороне сервера для создания работы PDF в фоновом режиме ...

Есть ли способ сделать это на стороне клиента с GWT API?

Ответы [ 2 ]

7 голосов
/ 21 февраля 2011

Вы видели этот вопрос переполнения стека Определить, когда браузер получает загрузку файла ? В основном, ответ дается, что вы устанавливаете cookie в ответном ответе и ждете на стороне клиента, чтобы этот cookie был установлен. Это можно легко сделать с помощью GWT, так как он имеет планировщик (для повторной проверки таймера) и легкий доступ к файлам cookie. Вам все еще нужно внести некоторые изменения на сервере, но вам не нужно создавать фоновый процесс.

5 голосов
/ 18 февраля 2011

У меня нет полного ответа, но следующий код работает для меня в Safari, и, возможно, вы можете изменить его, чтобы он работал и с другими браузерами (?):

<html><head>
<script type="text/javascript">
  function showPdf() {
    document.getElementById("loading").style.visibility = "hidden";
    document.getElementById("pdf").style.visibility = "visible";
  }
</script>
</head>

<body marginwidth="0" marginheight="0" bgcolor="rgb(38,38,38)">
  <div id="loading"
    style="position: absolute; background-color: white;">Loading...</div>

  <iframe id="pdf" width="100%" height="100%" name="plugin"
    src="http://myserver/?cmd=getMyPdf" onload="javascript:showPdf();"
        style="visibility: hidden;"></iframe>
</body>
</html>

Это чистый JavaScript - но, безусловно, это можно сделать и с GWT.Обратите внимание, что я использую iframe вместо embed, потому что embed на самом деле не поддерживает метод onload (и насколько я помню, embed не является стандартным элементом HTML).

Причина, почемуэто может быть не полный ответ, это то, что Chrome запускает событие onload, как только PDF начинает загружаться (но после завершения генерации PDF на стороне сервера).Я не уверен, если ты этого хочешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...