2010-03-12 40 views
1

我有一个控制器(Spring-MVC)生成一个获取请求的PDF报告。控制器将标题设置为“application/OCTET-STREAM”,“Content-Disposition”,“attachment; filename = \”“+ filename +”\“”,以便用户获得强制保存/打开对话框。控制器获得生成的pdf并将pdf字节直接写入响应的输出流。返回的ModelAndView为null。ajax/html/javascript解决方案禁用报表生成按钮,然后改变

问题是我需要/想要禁用点击后生成报告请求的按钮,然后在报告完成时重新启用它以防止双击。

我以为我可以使用prototype.org的Ajax.Request来做到这一点......这段代码的确可以正常工作按钮,但之后我被卡住了,因为客户端从未获得pdf。我猜我需要做一些回应,但我不知道是什么。任何想法/帮助表示赞赏。

function displayPdf(button_b, pdf_url) { 
    button_b.disabled = true; 
    new Ajax.Request(pdf_url, { 
     asynchronous:true, 
     evalScripts:true, 
     method:'get', 
     onComplete: function(response) { 
     button_b.disabled = false; 
     }, 
     onFailure: function() { 
      redAlert('crap'); 
    } 
    }); 
} 

回答

0

我能想到来完成你想要的一切的最好方式,假设你仍然强迫下载会是这样的,我认为:

<html> 
<head> 
    <script> 
     function get_it() { 
      document.getElementById('the_button').disabled = true; 
      document.getElementById('the_frame').src = "http://www.ca3.uscourts.gov/opinarch/063575p.pdf"; 
     } 
     function enable_button() { 
      document.getElementById('the_button').disabled = false; 
     } 
    </script> 
</head> 
<body> 
    <iframe id='the_frame' onload='enable_button()'></iframe> 
    <button id='the_button' onclick='get_it()'>Get it</button> 
</body> 
</html> 

基本上,你告诉它来将它发送到iframe而不是使用AJAX请求。一旦pdf准备就绪,iframe的onload事件将触发,重新启用按钮。您可能想要使用实际的事件侦听器,而不是我在示例中使用的已弃用的内联侦听器:P

+0

我不能投票,因为我是一个noob,但这是一个公平的解决方案。感谢:D – BabaBooey 2010-03-15 14:08:50

0

我的猜测是你只是想防止双击按钮。为什么不单单使用setTimeout来点击按钮几秒后启用按钮?

setTimeout() example

所以你desplayPdf函数的开始,你可以把:

setTimeout("button-b.disabled = false",4000); 

这之后它被点击关闭按钮4秒钟,然后启用它。

+0

是的 - 我只是想禁用双击。 setTimeout是我考虑的一个选项,但我希望更精确一些,因为报告生成时间可能会有所不同。另外,如果可以完成,我只是很好奇。 – BabaBooey 2010-03-12 19:18:05

+0

我不认为你可以做到你想要的,但我的建议和Chibu的应该给你可行的选择。 – Erik 2010-03-12 19:22:39