jQuery ドリルダウンメニューの実装方法を徹底解説!
本記事では、ウェブサイトのユーザビリティ向上に役立つjQueryドリルダウンメニューの実装方法について、基礎から応用まで分かりやすく解説します。初心者の方でも理解しやすいよう、サンプルコードを交えながら丁寧に解説していくので、ぜひ最後まで読んで実装してみてください。
jQueryでセレクトボックスをドリルダウン表示する方法
1. デモ 
- 会社名、部署名、役割の3つのセレクトボックスがあります。 
- 会社名を選択すると、それに紐づく部署名だけが選択肢として表示されます。 
- さらに部署名を選択すると、その部署に属する役割だけが選択肢として表示されます。 
2. フォームの設定 
- 会社名 
- 部署名 
- 役割 
3. HTMLの設定 
<select name="company" id="lv1" class="group1">
  <option value="" selected="selected">----- 選択してください -----</option>
  <option value="1">Aデザイン社</option>
  <option value="2">B不動産</option>
  <option value="3">C商事</option>
</select>
<select name="department" id="lv2" class="group1" disabled="disabled">
  <option value="">----- 選択してください -----</option>
  <option value="1" class="p1">開発部</option>
  <option value="2" class="p1">デザイン部</option>
  <option value="3" class="p1">システム技術部</option>
  <option value="4" class="p2">建設企画部</option>
  <option value="5" class="p2">賃貸管理部</option>
  <option value="6" class="p3">生活産業部</option>
  <option value="7" class="p3">総務部</option>
  <option value="8" class="p3">海外支社</option>
</select>
<select name="role" id="lv3" class="group1" disabled="disabled">
  <option value="">----- 選択してください -----</option>
  <option value="1" class="p1">Webエンジニア</option>
  <option value="2" class="p1">プログラマー</option>
  <!-- ... (その他の選択肢) ... -->
</select>- 階層の定義 : 各セレクトボックスのid属性にlv1、lv2、lv3のように階層番号を指定します。
- グループ化 : 連動するセレクトボックスには、class属性に共通のクラス名(例:group1)を指定します。
- 選択肢の紐付け : 各選択肢の<option>タグには、上位階層の選択肢と紐付けるためのclass属性を指定します。- 例えば、「部署名」の選択肢では、class="p1"は「会社名」のvalue="1"(Aデザイン社)に紐づきます。 
- p + 上位階層のvalue値 という形式でクラス名を付けます。 
 
- 初期状態 : 下位階層のセレクトボックスは、disabled="disabled"で初期状態では選択できないようにします。
4. jQueryの設定 
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>$(document).ready(function(){
  $(this).tgHierSelectV2({
    group: 'group1', 
    maxLevel: '3',  
    defaultSelect: '----- 選択してください -----', 
  });
});
(function($){
  $.fn.tgHierSelectV2 = function(options){
    var opts = $.extend({}, $.fn.tgHierSelectV2.defaults, options);
    var cnt;
    var arr = [];
    /* 各階層の選択肢を配列に格納 */
    $('html').find('select.'+opts.group).each( function(){
      var lvTxt = parseInt($(this).attr('id').replace(/lv/, ""));
      arr[lvTxt] = $('#lv'+lvTxt+' option').clone();
    });   
    /* 選択肢の反映処理 */
    $($('select.'+opts.group)).each(function(){
      var pdVal = $(this).val();
      var currentLvNum = parseInt($(this).attr('id').replace(/lv/, ""));
      var nextLevelNum = currentLvNum+1;
      if(pdVal != '' && pdVal != opts.defaultSelect){
        drillDownOption(pdVal,currentLvNum,nextLevelNum);
        $('#lv'+nextLevelNum).prepend('<option selected="selected">'+ opts.defaultSelect + '</option>');
      }
    });
    /* 各セレクトボックスの変更イベント */
    $('html').find('select.'+opts.group).each( function(){
      var lvTxt = parseInt($(this).attr('id').replace(/lv/, ""));
      $('#'+this.id).change( function(){
        var pdVal = $(this).val();
        var currentLvNum = parseInt($(this).attr('id').replace(/lv/, ""));
        var nextLevelNum = currentLvNum+1;
        drillDownOption(pdVal,currentLvNum,nextLevelNum);
        // 変更したプルダウン以下の子プルダウンを全てdisabledに
        for(cnt=nextLevelNum; cnt<=opts.maxLevel; cnt++){
          $('#lv'+cnt).attr("disabled", "disabled").prepend('<option selected="selected">'+opts.defaultSelect+'</option>');
        }
      });
    });
    /* ドリルダウンオプションを表示する関数 */
    function drillDownOption(pdVal,currentLvNum,nextLevelNum){
      $('#lv'+nextLevelNum).removeAttr("disabled");              
      $('#lv'+nextLevelNum+" option").remove();                
      $(arr[currentLvNum+1]).clone().appendTo('#lv'+nextLevelNum); 
      $('#lv'+nextLevelNum+" option[class != 'p"+pdVal+"']").remove(); 
    }
  }
})(jQuery);- $(document).ready(function(){ ... });: HTMLの読み込みが完了した後に実行される処理を記述します。 
- $(this).tgHierSelectV2({ ... });: tgHierSelectV2というプラグイン関数を呼び出して、ドリルダウンの動作を設定します。 
- プラグインの設定 :- group: 連動するセレクトボックスのグループ名(HTMLのclass属性で指定した値)を指定します。 
- maxLevel: 階層の最大数を指定します。今回は3階層なので3を指定します。 
- defaultSelect: 未選択状態の選択肢に表示するテキストを指定します。 
 
- プラグインのコード (tgHierSelectV2) :- 各階層の選択肢を配列に格納します。 
- 初期表示時に、選択されている値に基づいて下位階層の選択肢を反映します。 
- 各セレクトボックスの変更イベントを設定し、選択値に基づいて下位階層の選択肢を動的に更新します。 
- drillDownOption関数は、指定された階層のセレクトボックスに、上位階層の選択値に紐づく選択肢だけを表示します。 
 
5. まとめ 
参考資料
Q&A
Q1: ドリルダウンメニューは何階層まで対応できますか?
A1: 階層の数に制限はありません。ただし、階層が深くなりすぎるとユーザビリティが低下する可能性があります。
Q2: ドリルダウンメニューのデザインは自由にカスタマイズできますか?
A2: はい、CSSで自由にデザインをカスタマイズできます。色、サイズ、フォント、アニメーション効果などを調整して、ウェブサイトのデザインに最適なドリルダウンメニューを作成しましょう。
Q3: JavaScriptフレームワークを使わずにドリルダウンメニューを実装することはできますか?
A3: はい、JavaScriptのみで実装することも可能です。ただし、jQueryなどのフレームワークを使用すると、コード量が少なくなり、より簡単に実装することができます。
その他の参考記事:jquery dropdownplain