javascript テーブル trの入れ替え

10月 1st, 2009 by admin Leave a reply »

javascriptでテーブルで並べられたデータの順番を入れ変えようと思った。
prototype.jsで動くscriptaculous.jsでsortableを使おうと思ったけど、
処理が重いのか動きが鈍すぎて使い物にならない。
とりあえずボタンクリックで上に移動、下に移動が実現できれば良しとした。

順番の保存はテーブル内にhiddenタグを入れてpostされた順番をそのまま取得すれば、良さそうだ。

HTML

<table id="imglist_table" >
<thead>
  <tr class="head">
    <td width="100px">画像</td>
    <td>あげる</td>
    <td>さげる</td>
  </tr>
</thead>
<tbody>
 <tr id="tr1">
  <td><em>画像</em></td>
  <td><a title="順番を上げます" onclick="itemUp('tr1');return false;" href="#"></td>
  <td><a title="順番を下げます" onclick="itemDown('tr1');return false;" href="#"></td>
 </tr>
 <tr id="tr2">
  <td><em>画像</em></td>
  <td><a title="順番を上げます" onclick="itemUp('tr2');return false;" href="#"></td>
  <td><a title="順番を下げます" onclick="itemDown('tr2');return false;" href="#"></td>
 </tr>
 <tr id="tr3">
  <td><em>画像</em></td>
  <td><a title="順番を上げます" onclick="itemUp('tr3');return false;" href="#"></td>
  <td><a title="順番を下げます" onclick="itemDown('tr3');return false;" href="#"></td>
 </tr>
</tbody>
</table>

javascript(prototype.js使用)

function itemUp(thisElem)
{
    var tbleElem = $('imglist_table');
    var tbodyElem = tbleElem.getElementsByTagName("tbody")[0];
 
    if ( $(thisElem).previousSibling){
        tbodyElem.insertBefore( $(thisElem) , $(thisElem).previousSibling );
    }
}
 
function itemDown(thisElem)
{
    var tbleElem = $('imglist_table');
    var tbodyElem = tbleElem.getElementsByTagName("tbody")[0];
 
    if ($(thisElem).nextSibling){
        tbodyElem.insertBefore( $(thisElem).nextSibling , $(thisElem) );
    }
}

ざっくり書くとこんな感じになった。
子ノードを追加するappendChildと指定エレメントの上部に挿入するinsertBeforeがあるけど、順番を下げる場合は、指定の下に挿入が無くて困った。
よーーく悩んでみれば、下のエレメントを上部に挿入でいけるじゃんって思いついた。
俺ってすげーw

tableにtbodyを使っているのはIE対策。

上の要素、下の要素を確認するためif(Elem)を使っているけど
もしかしたらブラウザによってダメな場合があるかも?

あとは、改良して、瞬間移動されるのをエフェクトを使って移動しましたーって
ビジュアル的にわかりやすくするとか必要かもね。

後から調べたらここをよく読んでおけばよかったかも^^;
http://d.hatena.ne.jp/uupaa/20080130

Advertisement

コメントを残す