带有 StateSave 的子行
DataTables API 有许多方法可将子行附加到 DataTable 中的父行。这可用于显示有关行的其他信息,对于希望传达比主机表中可用的行更多信息的案例十分有用。
下面的示例同时使用 stateSave
和 row().child
方法来首先检查行是否已显示,如果已显示则将其隐藏 (row().child.hide()
),否则显示它 (row().child.show()
)。此示例中子行的内容由 format()
函数定义,但您可以使用您想要显示的任何内容替换它,例如 向服务端发送 Ajax 调用 以获取任何额外信息。
由于状态保存元素,可以在重新加载时为此示例维护状态。用户必须为 requestChild.dt
添加侦听器,以他们喜欢的任何格式显示行。
还必须在表初始化之前设置侦听器,否则当尝试加载状态时,侦听器中设置的功能将不可用。
姓名 | 职位 | 办公室 | 工资 | |
---|---|---|---|---|
姓名 | 职位 | 办公室 | 工资 |
- Javascript
- HTML
- CSS
- Ajax
- 服务器端脚本
- 注释
下面显示的 Javascript 用于初始化此示例中显示的表
// 用于行详细信息的格式化功能 - 根据需要修改 function format(d) { // `d` 是行的原始数据对象 return ( '<dl>' + '<dt>全名:</dt>' + '<dd>' + d.name + '</dd>' + '<dt>分机号:</dt>' + '<dd>' + d.extn + '</dd>' + '<dt>其他信息:</dt>' + '<dd>以及此处任何其他详细信息(图像等)...</dd>' + '</dl>' ); } var table = $('#example').DataTable({ ajax: '../ajax/data/objects.txt', columns: [ { className: 'dt-control', orderable: false, data: null, defaultContent: '' }, { data: 'name' }, { data: 'position' }, { data: 'office' }, { data: 'salary' } ], order: [[1, 'asc']], rowId: 'id', stateSave: true }); table.on('requestChild.dt', function (e, row) { row.child(format(row.data())).show(); }); // 添加用于打开和关闭详细信息的事件侦听器 $('#example tbody').on('click', 'td.dt-control', function () { var tr = $(this).closest('tr'); var row = table.row(tr); if (row.child.isShown()) { // 此行已打开 - 将其关闭 row.child.hide(); } else { // 打开此行 row.child(format(row.data())).show(); } });
// 格式化行详细信息的函数 - 根据需要修改 function format(d) { // `d` 是行的原始数据对象 return ( '<dl>' + '<dt>完整姓名:</dt>' + '<dd>' + d.name + '</dd>' + '<dt>分机号码:</dt>' + '<dd>' + d.extn + '</dd>' + '<dt>其他信息:</dt>' + '<dd>以及此处进一步的详细信息(图像等)...</dd>' + '</dl>' ); } let table = new DataTable('#example', { ajax: '../ajax/data/objects.txt', columns: [ { className: 'dt-control', orderable: false, data: null, defaultContent: '' }, { data: 'name' }, { data: 'position' }, { data: 'office' }, { data: 'salary' } ], order: [[1, 'asc']], rowId: 'id', stateSave: true }); table.on('requestChild.dt', function (e, row) { row.child(format(row.data())).show(); }); // 添加事件侦听器以打开和关闭详细记录 table.on('click', 'td.dt-control', function (e) { let tr = e.target.closest('tr'); let row = table.row(tr); if (row.child.isShown()) { // 该行已打开 - 将其关闭 row.child.hide(); } else { // 打开此行 row.child(format(row.data())).show(); } });
除了上述代码之外,还加载了以下 JavaScript 库文件以在该示例中使用
下面显示的 HTML 是原始 HTML 表元素,在 DataTables 增强它之前
此示例使用了一些额外的 CSS,这些 CSS 超出了从库文件加载的范围(如下所示),以便正确显示表格。下面显示了使用的附加 CSS
在该示例中加载了以下 CSS 库文件,以提供表格的样式设置
该表格通过 Ajax 加载数据。下面显示了已加载的最新数据。随着加载任何附加数据,此数据将自动更新。
下面显示了用于对该表格执行服务器端处理的脚本。请注意,这仅是使用 PHP 的示例脚本。服务器端处理脚本可以用任何语言编写,使用 DataTables 文档中描述的协议。