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かはてブコメントにて。