htmlテーブルヘッダーをマウスでクリックしてテーブルデータのカスタムソートを実現
4782 ワード
/**
* , int(float、string、date)
*/
// tableId: id,iCol: 0 ;dataType:iCol , : date
function sortAble(th, tableId, iCol, dataType) {
var ascChar = "▲";
var descChar = "▼";
var table = document.getElementById(tableId);
//
for (var t = 0; t < table.tHead.rows[0].cells.length; t++) {
var th = $(table.tHead.rows[0].cells[t]);
var thText = th.html().replace(ascChar, "").replace(descChar, "");
if (t == iCol) {
th.css("background-color", "#ccc");
} else {
th.css("background-color", "#d2d8de");
th.html(thText);
}
}
var tbody = table.tBodies[0];
var colRows = tbody.rows;
var aTrs = new Array;
// ,
for (var i = 0; i < colRows.length; i++) {
// : “ ”,
// if ($(colRows[i]).attr("group") != undefined) {
aTrs.push(colRows[i]);
// }
}
// 。
var thCol = $(table.tHead.rows[0].cells[iCol]);
if (table.sortCol == iCol) {
aTrs.reverse();
} else {
// , sort ,
aTrs.sort(compareEle(iCol, dataType));
}
var oFragment = document.createDocumentFragment();
for (var i = 0; i < aTrs.length; i++) {
oFragment.appendChild(aTrs[i]);
}
tbody.appendChild(oFragment);
//
table.sortCol = iCol;
// “ 、 ”
var th = $(table.tHead.rows[0].cells[iCol]);
if (th.html().indexOf(ascChar) == -1 && th.html().indexOf(descChar) == -1) {
th.html(th.html() + ascChar);
} else if (th.html().indexOf(ascChar) != -1) {
th.html(th.html().replace(ascChar, descChar));
} else if (th.html().indexOf(descChar) != -1) {
th.html(th.html().replace(descChar, ascChar));
}
//
var subRows = $("#" + tableId + " tr[parent]");
for (var t = subRows.length - 1; t >= 0; t--) {
var parent = $("#" + tableId + " tr[group='"
+ $(subRows[t]).attr("parent") + "']");
parent.after($(subRows[t]));
}
}
//
function convert(sValue, dataType) {
switch (dataType) {
case "int":
return parseInt(sValue, 10);
case "float":
return parseFloat(sValue);
case "date":
return new Date(Date.parse(sValue));
case "string":
default:
return sValue.toString();
}
}
// ,iCol ,dataType
function compareEle(iCol, dataType) {
return function(oTR1, oTR2) {
var vValue1 = convert(removeHtmlTag($(oTR1.cells[iCol]).html()),
dataType);
var vValue2 = convert(removeHtmlTag($(oTR2.cells[iCol]).html()),
dataType);
if (vValue1 < vValue2) {
return -1;
} else {
return 1;
}
};
}
// html
function removeHtmlTag(html) {
return html.replace(/]+>/g, "");
}
htmlページの使い方:
: