瀏覽器取消一次下載多個文件,只下載最后一個及解決方案

問題描述:業(yè)務(wù)需求需要用戶選擇資源進(jìn)行批量下載

<div class="m1 m">方法1:window.open</div>
<div class="m2 m">方法2:setTimeout</div>
<div class="m3 m">方法3: iframe</div>
<script>
let resourceArr = [
    'https://dldir1.qq.com/weixin/android/weixin8016android2040_arm64.apk', // 微信Andorid
    'https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe', // 微信Windows
    'https://dldir1.qq.com/weixin/mac/WeChatMac.dmg', // 微信Mac
];
</scrIpt>

問題原因:

本質(zhì)上是瀏覽器在完成上一個下載鏈接必須要做的的準(zhǔn)備工作之前,就單擊了下一個鏈接,從而取消了上一個下載操作;

如果這不是下載,而是頁面的常規(guī)鏈接,那么這就是用戶想要的行為:

  • 如果用戶首先點(diǎn)擊頁面 A 的鏈接,然后失去耐心并點(diǎn)擊頁面 B 的另一個鏈接,那么頁面請求 A 在那一點(diǎn)被取消
  • 不需要同時加載兩個資源,因為無論如何只能一個頁面同時只能展示一個;

解決方案:

方法1: 利用 window.open(url) 實(shí)現(xiàn)

let m1 = document.querySelector('.m1');
m1.addEventListener('click',  () => {
    for (let i = 0; i < resourceArr.length; i++) {
        window.open(resourceArr[i])
    }
})

缺點(diǎn):需打開新的窗口體驗不好

方法2:利用 setTimeout 添加定時器

const createDowloadLink = (url) => {
    let aDom = document.createElement('a') //創(chuàng)建標(biāo)簽i
    aDom.setAttribute('download', ''); //dowload設(shè)置下載屬性
    let evt = document.createEvent('HTMLEvents') //創(chuàng)建事件
    evt.initEvent('click', false, false) //初始化事件,綁定點(diǎn)擊事件,不冒泡,不阻止瀏覽器默認(rèn)行為
    aDom.href = url;
    aDom.dispatchEvent(evt) //分發(fā)事件
    aDom.click() // 觸發(fā)事件
}
let m2 = document.querySelector('.m2');
m2.addEventListener('click',  () => {
    resourceArr.forEach((item, index) => {
        setTimeout(() => {
            createDowloadLink(item)
        }, 500 * (index + 1))
    })
})

缺點(diǎn):時間間隔設(shè)置不好,同樣會造成有些資源無法下載,例如,如果網(wǎng)速慢,資源響應(yīng)時間長,這個時候的定時時長就不好估計


image.png

image.png

方法3: 利用 iframe

const iframeDownload = (link) => {
    var iFrame = document.createElement('iframe');
    iFrame.src = link;
    iFrame.style.display = 'none';
    document.body.appendChild(iFrame);
}
let m3 = document.querySelector('.m3');
m3.addEventListener('click',  () => {
    for (let item of resourceArr) {
        iframeDownload(item);
    }
})

參考鏈接:

  1. Browser is cancelling multiple file download requests
  2. 一次下載多個文件的解決思路-JS
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容