卡在下载循环

问题描述

我一直在为用户提供一个 XLSX 文件的 HTML 页面上工作。它运行良好,但在首次下载后,用户会陷入下载循环。

目前我正在使用这些库:Sheetjs 和 Filesaver。

负责构建xlsx文件和下载的函数

function exportxls(){
    var wb = XLSX.utils.book_new();
    wb.Props = {
        Title: "Test001",Subject: "teste",Author: "Moreira",CreatedDate: new Date(2021,02,01)
    };
    
    wb.SheetNames.push("Test Sheet");
    var ws_data = [['hello','world']];
    var ws = XLSX.utils.aoa_to_sheet(ws_data);
    wb.Sheets["Test Sheet"] = ws;
    var wbout = XLSX.write(wb,{bookType:'xlsx',type: 'binary'});
    
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i=0; i<s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
        return buf;        
    }

    $("#button-a").click(function(){
        saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}),'test.xlsx');
    }); 
}

解决方法

这是因为你把$("#button-a").click(function(){...放在exportxls()里面,当你调用这个函数的时候,它会把click事件附加到按钮上。把它移到外面。

function exportxls() {
  var wb = XLSX.utils.book_new();
  wb.Props = {
    Title: "Test001",Subject: "teste",Author: "Moreira",CreatedDate: new Date(2021,02,01)
  };
  
  wb.SheetNames.push("Test Sheet");
  var ws_data = [
    ['hello','world']
  ];
  var ws = XLSX.utils.aoa_to_sheet(ws_data);
  wb.Sheets["Test Sheet"] = ws;
  var wbout = XLSX.write(wb,{
    bookType: 'xlsx',type: 'binary'
  });
  
  function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
  }
  saveAs(new Blob([s2ab(wbout)],{
    type: "application/octet-stream"
  }),'test.xlsx');
  
}

$("#button-a").click(function () {
  exportxls();
});