【发布时间】:2018-07-27 15:08:28
【问题描述】:
我正在构建一个页面,该页面通过 Ajax 调用来检索 .csv 文件,并将值加载到 HTML 表中。我在 HTML 文件底部的 $(document).ready(function(){ ltm.init(); }); 调用中调用它。
它遍历 CSV 文件的行,并在 javascript 变量中构造一个 HTML 表,然后使用 $('#myTable').html(table_data) 将该表交给 DOM。下一个函数ltm.convertTableToDataTable() 使用$('#myTable').DataTable() 将其转换为简单的DataTable。然而,它并没有开火。我添加了一个按钮来调用convertTableToDataTable()函数,当我点击它时,它工作正常,并且DataTable功能齐全。
如果我将alert() 放在$('#myTable').DataTable() 之前的convertTableToDataTable 中,则会显示警报,并且表格会正确转换。如果我将警报移到 .DataTable() 调用之后,则会显示警报,并且表格不会转换。
我尝试使用 setTimeout($('#myTable').DataTable(),5000); 在 .DataTable() 调用之前引入延迟,但这也不起作用。
如何在没有警报的情况下加载数据并在我的页面上创建 DataTable 事物?
这是我的通用化 javascript sn-p:
var ltm = {
// local variables
urlCSV: 'myData.csv',
init: function() {
ltm.loadCSVDataIntoTable();
//alert('convertTableToDataTable fired!');
ltm.convertTableToDataTable();
// Bind click events
$('#btnLoadCSVData').click(function() {
ltm.loadCSVDataIntoTable();
});
$('#btnMakeDataTable').click(function() {
ltm.convertTableToDataTable();
});
},
loadCSVDataIntoTable: function() {
// The URL contains the .csv file. The first row of the file is the column headers.
$.ajax({
url:ltm.urlCSV,
dataType:"text",
success:function(csvData) {
var my_data = csvData.split(/\r?\n|\r/);
// var table_start = '<table class="table table-bordered table-striped" id="tblLTMStrains">';
var table_start = '<table class="display" id="tblLTMStrains">';
var table_end = '</table>';
var table_head_start = '<thead><tr>';
var table_head_end = '</tr></thead>';
var table_head = '';
var table_foot_start = '<tfoot><tr>';
var table_foot_end = '</tr></tfoot>';
var table_body_start = '<tbody>';
var table_body_end = '</tbody>';
var table_rows = '';
var table_data = '';
for(var intRow = 0; intRow<my_data.length; intRow++)
{
if (intRow===0) { // First row contains column headers
var cell_data = my_data[intRow].split(",");
for(var cell_intRow=0; cell_intRow<cell_data.length; cell_intRow++)
{
table_head += '<th>'+cell_data[cell_intRow]+'</th>';
}
} else {
if (my_data[intRow].length > 0) { // Gracefully handle null lines
var cell_data = my_data[intRow].split(",");
var blnLoadRow = true;
if ([Some conditions under which I want to filter out the row]) {
blnLoadRow = false;
}
if (blnLoadRow){
var thisRow = $('#templateDataRow').html();
// Can't put the <tr> content in a DIV without it stripping out all the tags
// Also, even if I don't put a <tbody> in, the DOM will create one anyway, so strip it out too.
thisRow = thisRow.replace("<table>","");
thisRow = thisRow.replace("<tbody>","");
thisRow = thisRow.replace("</tbody>","");
thisRow = thisRow.replace("</table>","");
thisRow = thisRow.replace("__MYFIELD0__",cell_data[0]);
thisRow = thisRow.replace("__MYFIELD1__",cell_data[1]);
thisRow = thisRow.replace("__MYFIELD2__",cell_data[2]);
thisRow = thisRow.replace("__MYFIELD3__",cell_data[3]);
thisRow = thisRow.replace("__MYFIELD4__",cell_data[4]);
table_rows += thisRow;
}
}
}
}
table_data = table_start;
table_data += table_head_start + table_head + table_head_end;
table_data += table_foot_start + table_head + table_foot_end;
table_data += table_body_start + table_rows + table_body_end;
table_data += table_end;
$('#divMyTable').html(table_data);
}
});
},
convertTableToDataTable: function() {
//alert('convertTableToDataTable fired - BEFORE!');
$('#myTable').DataTable();
//alert('convertTableToDataTable fired! - AFTER');
},
lastFunction: function() {} // all previous closing curly braces should have a comma after them
} // end of the ltm object.
【问题讨论】:
-
我看到你打电话给
$('#divMyTable').html(table_data);,但在其他地方你指的是 $('#myTable')`,这很重要吗?
标签: javascript jquery datatables