#javascript #csv #firefox
#javascript #csv #firefox
Вопрос:
Это хорошо работало около 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);
};
Комментарии:
1. можете ли вы попробовать
encodeURIComponent(csvContent)
?2. Попробовал, та же проблема! 🙁
3. ах, извините, я уже скучал по вам
encodeURI
. На самом деле, вы не должны encodeURI часть заголовка,csvContent = 'data:text/csv;charset=utf-8,' encodeURIComponent(csvContent);
4. Вот тут какая-то сладкая магия. Хотите сделать это в качестве ответа?
Ответ №1:
Firefox более требователен к символам, которые задаются в URI, чем chrome. Некоторые символы (например, #
) зарезервированы, если ваши данные содержат один из них, загрузка файла завершится неудачно.
Вы уже вызываете encodeURI
, но делаете это с полным URI, в то время как заголовок должен быть не закодирован.
Поэтому изменение csvContent = 'data:text/csv;charset=utf-8,' 'uFEFF' csvContent;
csvContent = 'data:text/csv;charset=utf-8,' encodeURIComponent(csvContent);
и удаление encodeURI(csvContent)
того, что появится позже, должно решить вашу проблему.