GWT - 在加载文件之前进行简单加载屏幕的最简单方法

时间:2011-02-18 13:56:59

标签: java gwt asynchronous download

单击按钮时,我的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 个答案:

答案 0 :(得分:7)

您是否看到此stackoverflow问题Detect when browser receives file download?基本上给出的答案是您在返回响应中设置cookie并在客户端等待设置此cookie。这可以通过GWT轻松完成,因为它有一个Scheduler(用于重复计时器检查)并可以轻松访问Cookies。您仍需要进行一些服务器更改,但不必创建后台进程。

答案 1 :(得分:5)

我没有完整的答案,但以下代码适用于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并不真正支持onload方法(并且就我记忆而言,embed不是标准的HTML元素)。

为什么这可能不是完整的答案,原因是 Chrome 在PDF开始下载后立即触发onload事件(但在服务器端生成PDF后)。我不确定,如果这是你想要的?