单击按钮时,我的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的客户端做这个?
答案 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后)。我不确定,如果这是你想要的?