X

[jQuery] セレクトボックスで選択した値で表を絞り込む方法(プラグイン不使用、動作デモ、サンプルコード有)

myrfa / Pixabay

Contents

表を検索したい!簡単に!

都道府県別にある情報を簡単に絞り込みたい。というご要望。

セレクトボックスに47都道府県の情報をあらかじめ設定しておきセレクトボックスを選択すると該当の都道府県を検索(絞り込み)する。

というかたちで実装を考えました。

テキストボックスだと入力するの面倒だし、都道府県で絞り込みたいだけなのでこのような形でどうだろうと。

jQueryのプラグインが色々とありましたが、自分でも簡単に表検索の仕組みが実装できそうだったので実装してみました。

参考になればと思い、ソースコードとデモサイトを作ったのでご活用下さいませ。

動作デモ・ソースコード

動作デモ

http://onocom.net/code/japan-prefecture/

ソースコード

https://gist.github.com/onocom/904991e984f1da14ef6e1d156bc6e570

ライセンス:WTFPL

好きに利用して改変して下さい。

実装したこと

セレクトボックスで選択した値(value)で表を検索(絞り込み)する機能を実装します。

ソースと解説

ソースコードサンプルと合わせてご覧くださいませ。

1.表を作る

取り敢えず検索するための表を作ります。

今回、都道府県の一覧表を作りました。

theadに見出しを。tbodyにデータを記述しましょう。

<table class="table table-borderd">
    <thead>
        <tr class="active">
            <td>番号</td>
            <td>都道府県名</td>
            <td>読み</td>
            <td>都道府県庁 所在地</td>
            <td>最大都市</td>
            <td>地方</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>01</td>
            <td>北海道</td>
            <td>ほっかいどう</td>
            <td>札幌市</td>
            <td>札幌市</td>
            <td>北海道</td>
        </tr>
        <tr>
            <td>02</td>
            <td>青森県</td>
            <td>あおもりけん</td>
            <td>青森市</td>
            <td>青森市</td>
            <td>東北</td>
        </tr>
        ・・・
    </tbody>
</table>

2.都道府県選択用のセレクトボックスを作る

表を絞り込む為のセレクトボックスを作ります。

<select id="pref-select" class="form-control">
    <option value="">都道府県で絞り込み</option>
    <option value="北海道">北海道</option>
    <option value="青森県">青森県</option>
    ・・・
</select>

optionタグのvalueに検索キーワードを割り当てます。valueの値で検索をかけるので、以下のようにvalueと異なる表示を設定してもOKです。

<option value="青森県">青森県で絞り込む</option>

また、最初のoptionのvalueは空にしておき、絞り込み解除用に使います。

3.JavaScriptを組む

キモとなるJavaScriptのコードは以下のように記述します。

コメントで処理を補足しておりますので、参考にしてみてくださいませ。

jQuery(function ($) {
    // セレクトボックスが変更されたら処理をする
    $('#pref-select').change(function () {
    
        // 選択した値を取得
        var select_val = $('#pref-select option:selected').val();
        
        // tbodyのtr数回 処理をする
        $.each($("#pref-table tbody tr"), function (index, element) {
        
            // 選択した値が空欄だったら、全ての行を表示する為の処理
            if (select_val == "") {
                $(element).css("display", "table-row");
                return true; // 次のtrへ
            }
            
            // 1行をテキストとして取り出し、セレクトボックスで選択した値があるかをチェック
            var row_text = $(element).text();
            
            if (row_text.indexOf(select_val) != -1) {
                // 見つかった場合は表示する
                $(element).css("display", "table-row");
            } else {
                // 見つからなかった場合は非表示に
                $(element).css("display", "none");
            }

        });
    });
});

まとめ

あえて、一般的なテキスト入力で絞り込む方法をせず、セレクトボックスで絞り込むようにしてみました。検索ワードが固定されている場合、この方が操作しやすいと思います。

もちろん上記を応用すれば、テキスト入力やラジオボタンで絞り込みなんてことも簡単に出来ます。

お役に立てば幸いです。

View Comments (9)

  • 初めまして。こちらを参考にテーブルを絞り込みできるようになりました!ありがとうございます。
    現在、セレクトボックスの連動(2段階)→連動結果からテーブル絞り込みという形を作っているんですが、この絞り込みを解除するようなボタンって作れますか?教えていただけるとありがたいです。。

    • megさんご質問ありがとうございます!

      絞り込みを解除する処理を入れたいということですね。

      リセットボタンがクリックされた時にセレクトボックスを初期化する処理と行の非表示を解除する処理を書いてあげればよろしいかと。

      この記事で紹介している都道府県の絞り込み処理をリセットする処理を書いてみました。ご参考にいただければ幸いです。

      上記を追加頂き、以下のようにidがresetとなっているボタンを何処かに配置することで、そのボタンをクリックした時に選択状態が解除されるはずです。

      // どこかにリセットボタンを設置
      

      お役に立てば幸いです。

  • 参考にさせていただきました。

    こちらのJSですが、
    検索項目が2つのセルからなるandでの絞り込みは、やはり難しいでしょうか。
    列をテキストにしている部分を、セルにできればできるのかな、とも思ったのですがうまくいかず…
    また可能な場合、「カレー」と「カレーうどん」のように一部のテキストがかぶってしまってはどうしようもないでしょうか。
    JSについては初心者のため、1から10までクレクレしているようで申し訳ないです。
    一部分でもわかれば展開できるかな、と思っております。

    お手すきの際に見ていただけますと幸いです。

    • sakeさん、ご質問ありがとうございます。

      複数条件の絞り込みを入れたいということですね。

      このような形で実装してみてはいかがでしょうか?適当な実装ですみません。エッセンスだけでも参考になればと。

      2つの条件で絞り込むサンプル作りました。
      http://onocom.net/code/japan-prefecture/index_2.html

      jQuery(function ($) {
          // 都道府県選択か別のセレクトボックスが変更されたら処理をする
          $('#pref-select,#other-select').change(function () {
          
              // 選択した値を取得
              var select_val1 = $('#pref-select  option:selected').val();
              var select_val2 = $('#other-select option:selected').val();
              
              // tbodyのtr数回 処理をする
              $.each($("#pref-table tbody tr"), function (index, element) {
              
                  // 選択した値がともに空欄だったら、全ての行を表示する為の処理
                  if (select_val1 == "" && select_val2 == "") {
                      $(element).css("display", "table-row");
                      return true; // 次のtrへ
                  }
                  
                  // 1行をテキストとして取り出し、セレクトボックスで選択した値があるかをチェック
                  var row_text = $(element).text();
                  
                  // フラグをfalseで初期化
                  var is_val1_match = false;
                  var is_val2_match = false;
                  
                  // 1つ目の値が空欄、もしくは、値が存在するか?
                  if (  select_val1 == "" || row_text.indexOf(select_val1) != -1 ) {
                      is_val1_match = true;
                  }
                  
                  // 2つ目の値が空欄、もしくは、値が存在するか?
                  if (  select_val2 == "" || row_text.indexOf(select_val2) != -1 ) {
                      is_val2_match = true;
                  }
                  
                  // 2つの値の結果をチェックして、ともにtrueなら表示
                  if (  is_val1_match && is_val2_match ) {
                      // 見つかった場合は表示する
                      $(element).css("display", "table-row");
                  } else {
                      // 見つからなかった場合は非表示に
                      $(element).css("display", "none");
                  }
                  
              });
          });
      });
      

      ちなみにこの方法だと、sakeさんがご指摘のように【「カレー」と「カレーうどん」のように一部のテキストがかぶってしまう。】というのはどうしようもないです。

      カレーとカレーうどんを区別する方法はぜひご自身でチャレンジしてみてください(^o^)

  • はじめまして。参考にさせていただきました。ありがとうございます。

    こちらのJS、trでなくtdでの絞り込みは可能でしょうか?
    テキストの入ったtdを3列で配置しているのですが、絞り込みを使うと全て改行されて
    レイアウトが崩れてしまいます。
    (当てはまらないものを除外したところにそのまま詰めて表示されるのが理想なのですが……)

    説明下手で申し訳ありませんが、助力をいただけると幸いです。

    • ご相談ありがとうございます。
      現在、以下の分岐の箇所で、現在、行を表示「する」「しない」だけを設定しておりますが、「行を表示する」場合、さらにその行のtdをループで取得して細かく表示/非表示を切り替えたらどうでしょうか?

      if (row_text.indexOf(select_val) != -1) {
      	$(element).css("display", "table-row"); // 行を表示する
      	// ここでtdを1つずつ取り出してチェックしていくかんじでどうでしょうか?
      } else {
      	$(element).css("display", "none"); // 行を表示しない
      }

      雑な回答でごめんなさい。解決のヒントになれば幸いです。

  • はじめまして。参考にさせて頂きました。
    一点ご質問なのですが、表示件数を取得したい場合どのようにすればよいのでしょうか。。

    • ご相談ありがとうございます。
      表示されている件数を取得したい場合は、以下のコードで現在表示されている件数が取得できるかと思います。
      ご参考にいただければ幸いです。

      $("#pref-table tbody tr:visible").length
  • はじめまして。参考にさせて頂きました。
    ご質問なのですが、セレクトボックス未選択時に、リストを非表示(項目だけ残す)にする場合はどのようにすればよいのでしょうか。
    お手すきの際に見ていただけますと幸いです。

Related Post