Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
仕事にて、tableをソートするJavascriptを作ることになったわけですが... たまたま拾ったサンプルがバリバリのDOMだったおかげで、「Javascriptにおけるオブジェクト指向」がちょっとずつ解ってきました。それはともかく。
おっかなびっくり組んでみると、なんだかんだで、とりあえず動きはするんですが... どうにもappendChild()でノードが追加されるというよりは置換されてるっぽい理屈に確信が持てません。「そういうプロパティなんだ」と言われれば、それまでなんですが。
2008-12-23: 完全オリジナルで作り直しました。
ソースは以下
HTML
<table border="1" width="580" cellspacing="0" class="cols">
<tbody>
<tr>
<th onClick="sortRow(this,0);">グループ名</th>
<th onClick="sortRow(this,1);">今日</th>
<th onClick="sortRow(this,2);">昨日</th>
<th onClick="sortRow(this,4);">先週</th>
</tr>
<tr>
<td>100</td>
<td>200</td>
<td>300</td>
<td>400</td>
<td>500</td>
</tr>
<tr>
<td>200</td>
<td>300</td>
<td>400</td>
<td>500</td>
<td>600</td>
</tr>
...
</tbody>
</table>
Script
var last_sort;
function sortRow(th,idx) {
// tbodyを特定する
var sec = th.parentNode.parentNode;
// trを特定する
var rows = sec.rows;
var N = rows.length - 1;
// 配列xを宣言
var x = new Array;
// 一時領域を定義
var marker = document.createElement('tbody');
// tdの値を配列xに格納。行番号を揃えた変数を用意する
for(var i=0; i<N; ++i) {
x[i] = Object(rows[i+1].cells[idx].firstChild.nodeValue);
x[i].row = rows[i+1];
}
// 配列xをソート
x.sort();
// 配列を逆順にする
if(last_sort == idx) {
x.reverse();
idx = -idx;
}
// secをmarkerにする
sec.parentNode.replaceChild(marker,sec);
// secにtrを追加する
for(var i=0; i<N; ++i) {
sec.appendChild(x[i].row);
}
// markerをsecにする
marker.parentNode.replaceChild(sec,marker);
// ソート情報を保存
last_sort = idx;
}
今後の課題
- table内をtbodyで満たしている(thead使いたい)
- ソートが甘い(ソート関数ちゃんと作らないと?)
- クリックポイントの体裁(thの上でカーソル変えるとか)
- th[0]だと連続で2回までしかソート変更できない
要するにサンプルコピったは良いけど、イマイチ改造できないと。なんとなく手ごたえはあるんだけど、あと一歩のとこで脳がJSモードに入ってないなぁ(汗
cf. Mata's Homepage, JavaScript テーブルソート
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。