javascript - 当内容带有 Content Disposition 附件时如何实现窗口加载回调?

标签 javascript jquery html content-disposition

我很难找到一个问题的解决方案,我认为这个问题很常见或很容易解决,但显然我错了。

我必须重新编写一些导致问题的网络代码(不是我写的)。当用户单击链接时,请求会发送到 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+"&param2="+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/

相关文章:

javascript - 只从字符串中获取完整路径,不带前面的 url

javascript - 跟踪数组内多个值的计数器

javascript - js 不传递 php 邮件的表单数据

javascript - 在 FireFox 中工作但不能在 IE 中工作...有点像

javascript - 如何找出 JavaScript 中函数的调用位置?

javascript - MongoDB 从控制台运行 javaScript 文件并输出

javascript - 如何使用Javascript或jQuery显示html内容?

javascript - 使用 jQuery 设置默认内容

html - 如何使用flexbox对齐一些 block

asp.net - 我们可以将 div 标签放在子母版页的 contentplaceholder 中吗