监听文档是否已做好下载准备

一、背景

业务需求:做文档的批量下载功能,排查代码后发现后端已支持该功能。啪啪啪三下做了个按钮,调了一下后端逻辑,下载文档较大的时候,后端下载和压缩期间,页面啥提示都没有。因此想在这期间做一个提示,并把下载按钮禁用掉。

二、调研

由于本人小白,所以查了很多资料,许多博客提到用iframe,总结一下这些方案:
1、前后端配合的方式,后端将文件下载进度放在cookie中,通过轮询cookie的方式,对文件下载进度进行获取,判断文件是否已经下载完毕。 缺陷:需要后端配合 ,且如果客户端禁用了cookie、无痕浏览,则该方案完全失效。
2、添加header配置,也有缺陷
3、定时器轮询监听readyState方式,很多博客都建议使用该方法,但我尝试之后,我本地的readyState状态一直是4,找了很久没找到原因。由于任务急,就放弃了iframe的实现方案。以下是该方法的实现代码,供诸君参考。
// 使用定时器轮询iframe的readyState,判断下载是否完成(弹出下载框或者开始下载)
var timer = setInterval(function () {
    var iframeDoc = excelIFrame.contentDocument || excelIFrame.contentWindow.document;
    // Check if loading is complete
    if (iframeDoc.readyState == 'complete' || iframeDoc.readyState == 'interactive') {
        // do something
        clearInterval(timer);
        return;
    }
}, 500);

三、最终实现

最后尝试用XMLHttpRequest,在没改后端逻辑的情况下,解决了需求,感谢网友的分享:
var xhh = new XMLHttpRequest();
page_url = url;
xhh.open("post", page_url);
xhh.responseType = 'blob';
xhh.onreadystatechange = function () {
    if (xhh.readyState === 4 && xhh.status === 200) {
        //do something
        var name = xhh.getResponseHeader("Content-disposition");
        var filename = name.substring(21,name.length);
        var csvUrl = URL.createObjectURL(this.response);
        var link = document.createElement('a');
        link.href = csvUrl;
        link.download = filename;
        link.click();
    }
};
xhh.send();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值