在之前的项目开发中,遇到的文件下载需求大多是单个文件,我采用的方法就是 a 标签的方式,具体代码如下:
let link = document.createElement('a');
link.href = url;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
最近遇到了同时下载多个文件的需求,我采用遍历文件列表,依次调用上面的函数的方法,结果在控制台上发现,一个新的链接发起请求,老的链接就会被 canceled,所以决定用 iframe 标签来代替 a 标签,具体代码如下:
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.style.height = 0;
iframe.src = url;
document.body.appendChild(iframe);
// 不能马上将 iframe 删除,否则也会出现取消的情况
setTimeout(() => {
iframe.remove();
}, 3000)