2016-07-19 7 views
0

Ich habe ein Skript zum Exportieren einer Ausgabetabelle nach CSV in JavaScript. Aus verschiedenen Gründen, die sich auf (jemand anderen) AJAX-Code beziehen, trigger ich dies mit einem Link anstelle eines Senden-Buttons.Tabelle in CSV in JavaScript exportieren funktioniert nicht für Tabelleneingabeelemente

HTML:

<a href="#" class="export"><img alt="ExportToExcel" src="../export1.png"></a> 

JavaScript:

(".export").on('click', function (event) { 
var d = new Date(); 
exportTableToCSV.apply(this, [$('#table1'), 'export' + d.getTime() + '.csv']); 
}); 

function exportTableToCSV($table, filename) { 
csv=createCSV($table,"yes"); 
csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv); 
if (navigator.msSaveOrOpenBlob) {  // separate deal for MS browsers 
    var blob = new Blob([csv],{type: "text/csv;charset=utf-8;"}); 
    navigator.msSaveOrOpenBlob(blob, filename + ".csv") 
} else{ 
    $(this) 
    .attr({ 
    'download': filename, 
    'href': csvData, 
    'target': '_blank' 
    }); 
    } 
} 
function createCSV($table,$vis){ 
    if($vis==="yes"){ 
    var $rows = $table.find('tr:has(td):visible'); 
    }else {var $rows = $table.find('tr:has(td)');} 
    tmpColDelim = String.fromCharCode(11), 
    tmpRowDelim = String.fromCharCode(0), 
    colDelim = '","', 
    rowDelim = '"\r\n"', 
    csv1 = '"' + $rows.map(function (i, row) { 
    var $row = $(row); 
    if($vis==="yes"){$cols = $row.find('td:visible'); 
    }else {$cols = $row.find('td');} 
    return $cols.map(function (j, col) { 
     var $col = $(col), 
     text = $col.text(); 
     return text.replace(/"/g, '""'); 
    }).get().join(tmpColDelim); 
     }).get().join(tmpRowDelim) 
     .split(tmpRowDelim).join(rowDelim) 
     .split(tmpColDelim).join(colDelim) + '"'; 
     return csv1; 
    } 
}); 

Das alles funktioniert gut, aber dann habe ich Texteingabefelder auf einige Zeilen in der Tabelle. Der Export lässt diese leer, selbst wenn Daten eingegeben wurden. Ich nehme an, das liegt daran, dass ich das Formular nicht erneut übermittele, aber ich kann die Daten aus diesen Feldern mit ('.tr_classname').serialize() abrufen.

+0

Ich habe es nicht gründlich überprüft, aber es sieht aus wie Sie $ col.text bekommen() die erst Rückkehr ein Textknoten in der Zelle (der td). Um den Text in einer Eingabe zu erhalten, möchten Sie eine Referenz auf diese Eingabe selbst erhalten und dann die Eigenschaft value mit .val() abrufen. – Mic

Antwort

0

In dieser Zeile

text = $col.text(); 

Sie erhalten den Text, aber wenn Sie den Inhalt einer Texteingabe erhalten möchten, sollten Sie

text = $col.val(); 

Mit diesem Wissen nutzen, müssen Sie bewerten wenn der Inhalt der td ist ein Eingabetext oder nur Text

0

die erste Antwort war viel hilfreicher. Danke Mic. dies funktioniert:

ersetzen:

text = $col.text(); 

mit:

if($col.find("input").val() != undefined){ text = $col.find("input").val(); 
}else { text = $col.text(); }