Экспорт сгенерированного javascript csv в Firefox экспортирует только первую строку, отлично работает в Chrome

#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) того, что появится позже, должно решить вашу проблему.