HTMLテーブルの列の表示非表示や行の入れ替えをJavaScriptで実装する方法

JavaScriptでtableを操作するサンプル

HTMLテーブルを操作することは、Web開発において重要なスキルの一つです。この記事では、JavaScriptを使ったHTMLテーブルの列の表示非表示や行の入れ替えの方法を解説します。

ドラッグドロップで列を入れ替える

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Tableの列の入れ替え</title>
  <style>
    table {
      border-collapse: collapse;
    }
    th, td {
      border: 1px solid #ccc;
      padding: 0.5rem;
      text-align: center;
      cursor: move;
    }
  </style>
</head>
<body>
  <table id="myTable">
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>性別</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>山田太郎</td>
        <td>20</td>
        <td>男性</td>
      </tr>
      <tr>
        <td>鈴木花子</td>
        <td>25</td>
        <td>女性</td>
      </tr>
      <tr>
        <td>田中一郎</td>
        <td>30</td>
        <td>男性</td>
      </tr>
    </tbody>
  </table>

  <script>
    let draggingColumn;

    // ドラッグ開始時に実行する関数
    function handleDragStart(e) {
      // ドラッグされた列の位置を保存する
      draggingColumn = e.target.cellIndex;
    }

    // ドラッグオーバー時に実行する関数
    function handleDragOver(e) {
      // ドロップ先の列の位置を取得する
      const dropIndex = e.target.cellIndex;

      // ドラッグされた列とドロップ先の列が異なる場合
      if (draggingColumn !== dropIndex) {
        const rows = document.querySelectorAll('#myTable tbody tr');
        rows.forEach(row => {
          // ドラッグされた列とドロップ先の列のセルを取得する
          const draggingCell = row.cells[draggingColumn];
          const dropCell = row.cells[dropIndex];

          // ドラッグされた列をドロップ先の列の前に挿入する
          if (draggingColumn < dropIndex) {
            row.insertBefore(dropCell, draggingCell);
          } else {
            row.insertBefore(draggingCell, dropCell);
          }
        });
      }
    }

    // 各列にイベントリスナーを登録する
    const columns = document.querySelectorAll('#myTable th');
    columns.forEach(column => {
      column.setAttribute('draggable', true);
      column.addEventListener('dragstart', handleDragStart);
      column.addEventListener('dragover', handleDragOver);
    });
  </script>
</body>
</html>

このコードでは、各列にdragstart、dragoverの2つのイベントリスナーを登録しています。dragstartイベントが発生した際には、ドラッグされた列の位置を変数draggingColumnに保存しています。そして、dragoverイベントが発生した際には、ドロップ先の列の位置を変数dropIndexに取得し、ドラッグされた列とドロップ先の列が異なる場合には、querySelectorAllメソッドを用いてテーブルのtbody要素内にあるすべての行を取得し、forEachメソッドを用いて各行に対して以下の処理を実行しています。

1.ドラッグされた列とドロップ先の列のセルを取得する。
2.ドラッグされた列をドロップ先の列の前に挿入する。

こうすることで、列の入れ替えを実現することができます。

ボタン操作で行を入れ替える

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Move Table Row Sample</title>
    <style>
      table {
        border-collapse: collapse;
      }
      th, td {
        border: 1px solid black;
        padding: 0.5em;
      }
      .dragged {
        opacity: 0.5;
      }
    </style>
  </head>
  <body>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>Gender</th>
        <th>Action</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>John Doe</td>
        <td>25</td>
        <td>Male</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>2</td>
        <td>Jane Smith</td>
        <td>30</td>
        <td>Female</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>3</td>
        <td>Bob Johnson</td>
        <td>40</td>
        <td>Male</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>4</td>
        <td>Alice Williams</td>
        <td>35</td>
        <td>Female</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
    </tbody>
  </table>
  <script>
    function moveUp(button) {
      const row = button.parentNode.parentNode;
      if (row.previousElementSibling) {
        row.parentNode.insertBefore(row, row.previousElementSibling);
      }
    }
    function moveDown(button) {
      const row = button.parentNode.parentNode;
      if (row.nextElementSibling) {
        row.parentNode.insertBefore(row.nextElementSibling, row);
      }
    }
  </script>
  </body>
</html>

このサンプルでは、

要素内の行をドラッグして入れ替えることができます。行をドラッグしたとき、dragstartイベントが発生して、ドラッグ中の行を保持します。ドラッグ中の行が他の行の上に移動すると、dragoverイベントが発生して、ドラッグ中の行を他の行の前または後ろに移動します。行をドロップすると、dragendイベントが発生して、ドラッグ中の行をリセットします。

列の一部を非表示にする

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>テーブルの列の表示非表示を切り替えるサンプル</title>
  <script>
    function hideColumn(columnIndex) {
      var table = document.getElementsByTagName("table")[0];
      var rows = table.rows;
      for (var i = 0; i < rows.length; i++) {
        rows[i].cells[columnIndex].style.display = "none";
      }
    }

    function showColumn(columnIndex) {
      var table = document.getElementsByTagName("table")[0];
      var rows = table.rows;
      for (var i = 0; i < rows.length; i++) {
        rows[i].cells[columnIndex].style.display = "";
      }
    }
  </script>
</head>
<body>
  <table>
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>メールアドレス</th>
        <th>電話番号</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>山田 太郎</td>
        <td>25</td>
        <td>taro.yamada@example.com</td>
        <td>012-345-6789</td>
      </tr>
      <tr>
        <td>鈴木 次郎</td>
        <td>30</td>
        <td>jiro.suzuki@example.com</td>
        <td>03-1234-5678</td>
      </tr>
    </tbody>
  </table>
  <button onclick="hideColumn(1)">2番目の列を非表示にする</button>
  <button onclick="showColumn(1)">2番目の列を表示する</button>
</body>
</html>

上記のコードでは、hideColumn関数を使用して、2番目の列を非表示にし、showColumn関数を使用して、2番目の列を表示することができます。

行の一部を非表示にする

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hide Table Row Sample</title>
    <style>
      .hidden {
        display: none;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
          <th>Gender</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>John Doe</td>
          <td>30</td>
          <td>Male</td>
        </tr>
        <tr>
          <td>Jane Smith</td>
          <td>25</td>
          <td>Female</td>
        </tr>
        <tr>
          <td>Bob Johnson</td>
          <td>40</td>
          <td>Male</td>
        </tr>
      </tbody>
    </table>

    <button onclick="toggleGender('Male')">Toggle Male Rows</button>

    <script>
      function toggleGender(gender) {
        const rows = document.querySelectorAll('table tbody tr');
        rows.forEach((row) => {
          const genderCell = row.querySelector('td:nth-child(3)');
          if (genderCell.innerText === gender) {
            row.classList.toggle('hidden');
          }
        });
      }
    </script>
  </body>
</html>

このサンプルでは、各行の3列目(Gender列)の値がMaleである行を非表示にするために、行全体にhiddenクラスを追加します。toggleGender()関数は、ボタンがクリックされたときに、各行のGender列の値が引数で指定された値(この場合はMale)と一致する場合に、その行を表示または非表示に切り替えるために、行全体に対してhiddenクラスをトグルします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031