【问题标题】:DataTables won't convert HTML table without an alert() beforehandDataTables 不会在没有 alert() 的情况下转换 HTML 表格
【发布时间】: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


【解决方案1】:

改变

$('#divMyTable').html(table_data);

$('#divMyTable').html(table_data).onload().DataTable();

这将确保在加载 html 时触发 DataTable。

并删除

convertTableToDataTable: function() {
        //alert('convertTableToDataTable fired - BEFORE!');
        $('#myTable').DataTable();
        //alert('convertTableToDataTable fired! - AFTER');
    },

【讨论】:

    猜你喜欢
    • 2021-09-19
    • 2011-11-20
    • 1970-01-01
    • 2018-10-12
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多