jQuery テーブルの行をボタン押下で並び替える

jQueryとJavaScriptでテーブルの行をボタン押下で並び替えるサンプルです。

目次

サンプル テーブルの行をボタン押下で並び替える

テーブルの行をボタン押下で並び替える

上ボタンを押すと、押下したボタンがある行が上に移動します。
下ボタンを押すと、押下したボタンがある行が下に移動します。
一番上または一番下のときは、アラートが表示され移動できません。

1テスト
2テスト
3テスト

コード

上記サンプルのコードです。

<style>
  table {border-collapse: collapse;}
  table td {border: 1px solid}
</style>
<table style="width: 70%;max-width: 300px;">
  <tbody>
    <tr id="1">
      <td>1テスト</td>
      <td><input type="button" value="上" onclick="moveUp(this)">
        <input type="button" value="下" onclick="moveDown(this)"></td>
    </tr>
    <tr id="2">
      <td>2テスト</td>
      <td><input  type="button" value="上" onclick="moveUp(this)">
        <input type="button" value="下" onclick="moveDown(this)"></td>
    </tr>
    <tr id="3">
      <td>3テスト</td>
      <td><input type="button" value="上" onclick="moveUp(this)">
        <input type="button" value="下" onclick="moveDown(this)"></td>
    </tr>
  </tbody>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
function moveUp(obj1) {
  // tr行を取得
  var line1 = obj1.parentNode.parentNode;
  // 一番上の行のときは終了する
  if(line1.previousElementSibling === null) {
    alert("1番上の行です");
    return;
  }
  // 行のIDを取得し移動
  a = line1.id;
  $("#" + a).insertBefore(line1.previousElementSibling);
}
function moveDown(obj1) {
  // tr行を取得
  var line1 = obj1.parentNode.parentNode;
  // 一番下の行のときは終了する
  if(line1.nextElementSibling === null) {
    alert("1番下の行です");
    return;
  }
  // 行のIDを取得し移動
  a = line1.id;
  $("#" + a).insertAfter(line1.nextElementSibling);
}
</script>

5~23行目は、htmlのテーブルです。
26行目からは上ボタンを押した時に実行されます。
28行目は、クリックした要素の親の親であるTRを取得します。
30行目のpreviousElementSiblingは、前の要素(兄の要素)を見て1番上の行であれば処理を終了します。
35行目は、TRのIDを取得します。
36行目は、jQueryのinsertBeforeで取得したTRを1つ前に移動します。

38行目からは下ボタンを押した時に実行されます。
40行目は上と同じくTRを取得します。
42行目のnextElementSibling は、次の要素(弟の要素)を見て一番下であれば処理を終了します。
48行目は、jQueryのinsertAfterで取得したTRを1つ後に移動します。

関連の記事

JavaScript DOMで移動する(nextElementSibling他)
jQuery 要素を移動する(appendTo/prependTo/insertAfter/insertBefore)

△上に戻る