我很难找到问题的解决方案,我认为这个问题非常普遍或直接解决,但显然我错了。
我必须重新编写一些导致问题的网络代码(我没有写过)。当用户单击链接时,会向Web服务器发送请求,Web服务器又从某个位置获取或创建PDF文档。返回PDF数据时Content-Disposition
标题设置为attachment
,浏览器显示另存为对话框。
出现“另存为”对话框的原因是,当用户单击该链接时,Javascript会将window.location.href
设置为服务器URL(带有一些参数)。
在处理请求时,除了浏览器在选项卡中显示的动画之外,没有加载动画。
问题在于,如果请求挂起或需要一段时间,用户往往会再次点击链接(可能多次),这意味着对同一资源的请求只会在服务器上累积(甚至意外双击链接,这是常见的,导致两个请求被处理)。
如何防止这种情况发生?如果我这样做(将window.location.href
替换为window.open
:
var REQUEST_PENDING = false;
function getPDF(param1, param2) {
if (REQUEST_PENDING) return;
REQUEST_PENDING = true;
var w = window.open("/GetPdf.servlet?param1="+param1+"¶m2="+param2);
w.onload = function() {
DOC_REQUEST_PENDING = false;
}
}
...然后一次只会处理一个请求,但onload回调仅在返回内容为HTML时才有效。如果它是我的附件,则DOC_REQUEST_PENDING变量永远不会设置为false,因此不能再进行任何请求。
我知道终极解决方案可能应该在服务器端实现,但是不可能实现我尝试做客户端的事情吗? (我可以使用jQuery)。
答案 0 :(得分:1)
@Cory上述评论中与之相关的问题似乎与我的问题重复,虽然我确信接受的答案完全正确,但有一点涉及它。在列表中有一个问题的另一个答案,它提供了一个指向这个jquery插件的链接:
http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
......无论如何,对我来说,这是最终的解决方案。易于使用,效果很好。