LoginSignup
11
14

More than 5 years have passed since last update.

行選択可能なTableを作って矢印キーで操作する

Posted at

クリック時に行選択ができるテーブルを作って、更に上下キーが押されたときにkeydownイベントを拾って選択を切り替えられるようにしてみた。
参考にしたのはStackOverFlowのこちらの質問の2番めの回答

概要

JavaScriptでは、フォーカスが設定できる要素じゃないとキーイベントが使えないらしいので、テーブルがクリックされた時にテキストボックスにフォーカスを設定してテキストボックスのイベントとして処理を行う。

実装

<div>
   <!-- readonly属性をつけとかないと、テーブルがクリックされたときに文字が入力できてしまう。 -->
   <input type="text" id="tableEventShifter" readonly>

   <table id="myTable">
     <thead>
        <tr><th>name</th><th> price</td></tr>
     </thead>
     <tbody>
       <tr>
         <td>aaaa</td><td>1000</td>
       </tr>
       <tr>
         <td>bbbb</td><td>2000</td>
       </tr>
       <tr>
         <td>cccc</td><td>3000</td>
       </tr>
      </tbody>
   </table>
</div>
body{margin:0;padding:0;}

/* テキストボックスを隠す */
div{background:white;}
#tableEventShifter{
  /* テキストボックスを邪魔にならない場所に置くのであれば特に以下の通りにしなくても大丈夫です。 */
  /* ただし、フォーカスが設定されないとだめなので、display:none;はNG*/
  position:absolute;
  z-index: -10;
  height:0;
}

/* 行の選択色 */
.selected {background:yellow;}

// テーブルクリック時、テキストボックスにフォーカスをセット
$("#myTable").on("click",function(e){
  $("#tableEventShifter").focus();
});

// クリック時、行選択(ヘッダ除く)
$("#myTable tbody tr").on("click",function(e){
  // 選択されている他の行があれば選択解除
  $(this).siblings().removeClass("selected");
  // クリックされた行を選択
  $(this).addClass("selected"); 
});

// Tableタグではkey系のイベントが拾えないので、textboxのイベントとしてバインドする
$("#tableEventShifter").on("keydown", function(e) {
    switch (e.keyCode) {
      case 38: // ↑キー
        // 上の行を選択
        $('#myTable tbody tr:not(:first).selected')
          .removeClass('selected')
          .prev().addClass('selected')
        break;

      case 40: // ↓キー
        // 下の行を選択
        $('#myTable tbody tr:not(:last).selected')
          .removeClass('selected')
          .next().addClass('selected')
        break;
    }
  // スクロールさせない
  e.preventDefault();
});

CodePen

See the Pen Row selectable table on key events. by Yanchi4425 (@yanchi4425) on CodePen.

11
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14