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

2022-09-03 15:17:15

单击按钮时,我的 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执行此客户端?


答案 1

您是否看到此堆栈溢出问题 检测浏览器何时收到文件下载?基本上给出的答案是,您在返回响应中设置了一个cookie,并在客户端等待设置此cookie。这可以通过GWT轻松完成,因为它具有调度程序(用于重复计时器检查)并且可以轻松访问Cookie。您仍然需要进行一些服务器更改,但您不必创建后台进程。


答案 2

我没有完整的答案,但以下代码在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在PDF开始下载后立即触发onload事件(但在服务器端的PDF生成完成后)。我不确定,如果这是你想要的吗?


推荐