步骤 1:临时存储标题行
首先,在我们重新排列表格的内部布局之前,您需要将表头和正文行与 DOM 隔离开来。
我们将使用 jQuery 的上下文选择器来执行此操作,您可能以前见过。它通过在您指定的上下文中选择元素来工作:如果该上下文是一个 DOM 节点 - 在这种情况下为表 - 它会选择该 DOM 节点中的元素。
注意:我在 JavaScript 变量名中使用 $ 前缀来表示我用来存储 jQuery 对象的变量——这是本练习中的所有变量。这是您不必自己使用的个人约定。
var $table = $('#your-table-id');
// This gets the first <tr> within the table, and remembers it here.
var $headRow = $('tr', $table).first();
$headRow.remove();
第 2 步:如有必要,创建 tbody
在这一点上,我们的工作要么更容易,要么更难。一些浏览器,如 Firefox,已经将表解释为具有一个隐式<tbody>
元素,其中所有其他行都已存储 - 如果是这种情况,我们的工作已经完成!否则,我们还有更多工作要做,需要创建它<tbody>
来存储当前行(所有这些都不是标题行)。
if (!$table.has('tbody')) {
var $otherRows = $('tr', $table);
$otherRows.remove();
var $tbody = $('<tbody>');
$table.append($tbody);
$tbody.append($otherRows);
}
第 3 步:创建主题
现在我们将在表格的开头插入 thead 元素,并将表格的标题行添加到其中。
var $thead = $('<thead>');
$table.prepend($thead);
$thead.append($headRow);
现在一切都很好。
正在运行的代码,减去我的评论
一:JSFiddle演示
现在代码没有我的谈论打破它:
var $table = $('#your-table-id');
// This gets the first <tr> within the table, and remembers it here.
var $headRow = $('tr', $table).first();
$headRow.remove();
if (!$table.has('tbody')) {
var $otherRows = $('tr', $table);
$otherRows.remove();
var $tbody = $('<tbody>');
$table.append($tbody);
$tbody.append($otherRows);
}
var $thead = $('<thead>');
$table.prepend($thead);
$thead.append($headRow);
一个迭代的替代方案
这将使用文档中的ms-listviewtable类覆盖每个表,而不是按 ID 精确定位一个表。
$('table.ms-listviewtable').each(function() {
var $table = $(this);
// The rest of the code as above goes within the function here,
// except, of course, for the line that sets the $table variable.
});