我很难找到一个问题的解决方案,我认为这个问题很常见或很容易解决,但显然我错了。
我必须重新编写一些导致问题的网络代码(不是我写的)。当用户单击链接时,请求会发送到 Web 服务器,而 Web 服务器又从某处获取或创建 PDF 文档。返回的 PDF 数据的 Content-Disposition
header 设置为 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)。
最佳答案
@Cory 在上面的评论中链接到的问题似乎确实是我的问题的重复,虽然我确信接受的答案完全没问题,但其中涉及到一些内容。该问题的另一个答案在列表中提供了此 jquery 插件的链接:
http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
...无论如何对我来说,这是最终的解决方案。易于使用且效果出色。
关于javascript - 当内容带有 Content Disposition 附件时如何实现窗口加载回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26341409/