大约2个月前,它运行良好,突然间Firefox除了第一行之外什么都不喜欢。但是,在调试代码时,data
变量包含完整的CSV文档。但是一旦下载了文件,我只会得到第一行。这在Chrome中有效,我发现它曾经在两者中都能正常工作。
关于如何解决此问题的任何建议?
以下是我的导出脚本。
PerformanceTableController.prototype.exportSplitTimes = function () {
var resultListId,
resultList,
columnId,
csv = [],
csvContent,
row,
i, l,
filename,
data,
link;
for (resultListId in this.raceData.resultLists) {
if (this.raceData.resultLists.hasOwnProperty(resultListId)) {
resultList = this.raceData.resultLists[resultListId];
csv.push(this.getCSVClassTitle(resultList));
csv.push(this.getCSVColumnHeaders());
for (i = 0, l = resultList.performanceList().length; i < l; i += 1) {
row = [];
for (columnId in resultList.performanceList()[i]) {
if (resultList.performanceList()[i].hasOwnProperty(columnId)) {
if (resultList.performanceList()[i][columnId].value !== undefined) {
row.push(resultList.performanceList()[i][columnId].value);
}
}
}
csv.push(row.join(","));
}
console.log(csv);
}
}
if (csv.length === 0) {
return;
}
filename = this.raceData.race.event.name + ' - ' + this.raceData.race.name + '.csv';
csvContent = csv.join("\n");
if (!csvContent.match(/^data:text\/csv/i)) {
csvContent = 'data:text/csv;charset=utf-8,' + '\uFEFF' + csvContent;
}
data = encodeURI(csvContent);
link = document.createElement('a');
link.setAttribute('href', csvContent);
link.setAttribute('download', filename);
link.style.display = 'none';
// Without this line, Firefox is not able to open the CSV
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
最佳答案
Firefox对URI中设置的字符比对chrome更挑剔。某些字符(例如#
)被保留,如果您的数据包含其中之一,则文件下载将失败。
您已经调用了encodeURI
,但是您对完整的URI进行了调用,同时应保持 header 为未编码状态。
所以改变csvContent = 'data:text/csv;charset=utf-8,' + '\uFEFF' + csvContent;
到csvContent = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csvContent);
并删除以后出现的encodeURI(csvContent)
应该可以解决您的问题。
关于javascript - 在Firefox中导出javascript生成的csv仅导出第一行,在chrome中可以正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39846565/