我需要转置HTML表格(交换行和列)。我发现了很多jQuery插件,但它们不仅仅是我需要的。
我从this stack改编了一些简洁的jQuery代码,但它不适用于包含thead和tfoot元素的表。
function tableTransform(objTable) {
objTable.each(function () {
var $this = $(this);
var newrows = [];
$this.find("tr").each(function () {
var i = 0;
$(this).find("td").each(function () {
i++;
if (newrows[i] === undefined) {
newrows[i] = $("<tr></tr>");
}
newrows[i].append($(this));
});
});
$this.find("tr").remove();
$.each(newrows, function () {
$this.append(this);
});
});
return false;
}
我创建了下面的小提琴,它提供了标记和代码的示例。有人可以更新函数,以便它支持thead和tfoot元素吗?
http://jsfiddle.net/4tobvo05/4/
就像现有代码一样,新代码必须在每个td以及表本身上维护类和样式值,以便正确应用CSS。它还需要修复tfoot,使其包含正确的数字td单元格,以包裹不间断的空间。
答案 0 :(得分:4)
我砍掉了这个功能,让它做我需要的东西。更新版本如下。
function tableTransform(objTable) {
if (typeof objTable != 'undefined') {
objTable.each(function () {
var $this = $(this);
var newrows = [];
$this.find("tbody tr, thead tr").each(function () {
var i = 0;
$(this).find("td, th").each(function () {
i++;
if (newrows[i] === undefined) {
newrows[i] = $("<tr></tr>");
}
newrows[i].append($(this));
});
});
$this.find("tr").remove();
$.each(newrows, function () {
$this.append(this);
});
});
//switch old th to td
objTable.find('th').wrapInner('<td />').contents().unwrap();
//move first tr into thead
var thead = objTable.find("thead");
var thRows = objTable.find("tr:first");
var copy = thRows.clone(true).appendTo("thead");
thRows.remove();
//switch td in thead into th
objTable.find('thead tr td').wrapInner('<th />').contents().unwrap();
//add tr back into tfoot
objTable.find('tfoot').append("<tr></tr>");
//add tds into tfoot
objTable.find('tbody tr:first td').each(function () {
objTable.find('tfoot tr').append("<td> </td>");
});
return false;
}
}
我还在下面创建了更新的小提琴。
http://jsfiddle.net/4tobvo05/7/
我确信可以进行许多优化或改进,以便我对任何人可能提出的任何建议持开放态度。
答案 1 :(得分:0)
此代码也适用于row和colspan。
jQuery("#table1").each(function() {
var jthis = jQuery(this);
var newrows = [];
var row = 0;
jthis.find("tr").each(function(){
row++;
var col = 0;
var prev_colspan = 0;
var prev_rowspan = 0;
var row_count = 0;
jQuery(this).find("td").each(function(){
col++;
var colspan = jQuery(this).attr("colspan");
var rowspan = jQuery(this).attr("rowspan");
if (colspan === undefined) {colspan = 0;}
if (rowspan === undefined) {rowspan = 0;}
jQuery(this).attr("rowspan",colspan);
jQuery(this).attr("colspan",rowspan);
var existing_row = jQuery(this).attr("row");
var existing_col = jQuery(this).attr("col");
row_count = col + prev_colspan;
if (existing_row === undefined || existing_col === undefined) {
jQuery(this).attr("row", row + prev_rowspan);
jQuery(this).attr("col", col + prev_colspan);
}
else {
row_count = existing_row;
jQuery(this).attr("col", existing_row);
jQuery(this).attr("row", existing_col);
}
if(newrows[row_count] === undefined) { newrows[row_count] = jQuery("<tr></tr>"); }
newrows[row_count].append(jQuery(this));
if (existing_row === undefined || existing_col === undefined) {
if (colspan > 0) {prev_colspan = parseInt(colspan) - 1; }
else {prev_colspan = 0;}
if (rowspan > 0) {prev_rowspan = parseInt(rowspan) - 1;}
else {prev_rowspan = 0;}
}
});
});
jthis.find("tr").remove();
jQuery.each(newrows, function(){
jthis.append(this);
});
});