2011-02-18 43 views
15

当点击一个按钮,我的GWT应用程序返回嵌入在HTML页面的PDF文件,它看起来像:GWT - 做一个简单的载入画面最简单的方法,直到文件被加载

<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

Vaadin,一个GWT的叉子,有这样的内建。您可以通过js(jQuery,extJS或类似的文件)来确保它的可用性 – 2011-02-27 20:15:04

+0

您希望在A)文件被完全下载之前显示等待屏幕,或者B)仅在pdf生成完成并且客户机开始下载之前? – 2011-02-28 09:25:04

回答

7

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

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方法(并且就我所知,嵌入不是标准的HTML元素)。

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