ajax / html / javascript解决方案,用于禁用报告生成按钮,然后重新启用

时间:2010-03-12 18:39:01

标签: javascript ajax web-applications prototypejs

我有一个控制器(Spring-MVC),可以根据get请求生成PDF报告。控制器设置标题,如“application / OCTET-STREAM”,“Content-Disposition”,“attachment; filename = \”“+ filename +”\“”,以便用户获得强制保存/打开对话框。控制器生成pdf并将pdf字节直接写入响应的输出流。返回的ModelAndView为null。

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

我以为我可以使用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');
     }
   });
}

2 个答案:

答案 0 :(得分:0)

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

setTimeout() example

所以在你的desplayPdf函数开始时,你可能会把:

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

这将在单击按钮后禁用按钮4秒,然后启用它。

答案 1 :(得分: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