プラグイン不要! jQueryで複数のセレクトボックスの選択肢を連動させる

プルダウンに親子関係

select要素にjQueryを使って親子関係を持たせる方法をご紹介します。
まずは実際に下記にサンプルを用意しました。

実際のソース

HTML

都道府県のoption要素にdata-valがあることに注目してください。
同じ地方に属する都道府県は同じ値になっています。

  1. <select class="parent" name="foo">
  2. <option value="" selected="selected">地方を選択</option>
  3. <option value="北海道・東北">北海道・東北</option>
  4. <option value="関東">関東</option>
  5. <option value="甲信越・北陸">甲信越・北陸</option>
  6. <option value="東海">東海</option>
  7. <option value="関西">関西</option>
  8. <option value="中国">中国</option>
  9. <option value="四国">四国</option>
  10. <option value="九州・沖縄">九州・沖縄</option>
  11. </select>
  12.  
  13. <select class="children" name="bar" disabled>
  14. <option value="" selected="selected">都道府県を選択</option>
  15. <option value="北海道" data-val="北海道・東北">北海道</option>
  16. <option value="青森県" data-val="北海道・東北">青森県</option>
  17. <option value="岩手県" data-val="北海道・東北">岩手県</option>
  18. <option value="宮城県" data-val="北海道・東北">宮城県</option>
  19. <option value="秋田県" data-val="北海道・東北">秋田県</option>
  20. <option value="山形県" data-val="北海道・東北">山形県</option>
  21. <option value="福島県" data-val="北海道・東北">福島県</option>
  22. <option value="茨城県" data-val="関東">茨城県</option>
  23. <option value="栃木県" data-val="関東">栃木県</option>
  24. <option value="群馬県" data-val="関東">群馬県</option>
  25. <option value="埼玉県" data-val="関東">埼玉県</option>
  26. <option value="千葉県" data-val="関東">千葉県</option>
  27. <option value="東京都" data-val="関東">東京都</option>
  28. <option value="神奈川県" data-val="関東">神奈川県</option>
  29. <option value="新潟県" data-val="甲信越・北陸">新潟県</option>
  30. <option value="富山県" data-val="甲信越・北陸">富山県</option>
  31. <option value="石川県" data-val="甲信越・北陸">石川県</option>
  32. <option value="福井県" data-val="甲信越・北陸">福井県</option>
  33. <option value="山梨県" data-val="甲信越・北陸">山梨県</option>
  34. <option value="長野県" data-val="甲信越・北陸">長野県</option>
  35. <option value="岐阜県" data-val="東海">岐阜県</option>
  36. <option value="静岡県" data-val="東海">静岡県</option>
  37. <option value="愛知県" data-val="東海">愛知県</option>
  38. <option value="三重県" data-val="東海">三重県</option>
  39. <option value="滋賀県" data-val="関西">滋賀県</option>
  40. <option value="京都府" data-val="関西">京都府</option>
  41. <option value="大阪府" data-val="関西">大阪府</option>
  42. <option value="兵庫県" data-val="関西">兵庫県</option>
  43. <option value="奈良県" data-val="関西">奈良県</option>
  44. <option value="和歌山県" data-val="関西">和歌山県</option>
  45. <option value="鳥取県" data-val="中国">鳥取県</option>
  46. <option value="島根県" data-val="中国">島根県</option>
  47. <option value="岡山県" data-val="中国">岡山県</option>
  48. <option value="広島県" data-val="中国">広島県</option>
  49. <option value="山口県" data-val="中国">山口県</option>
  50. <option value="徳島県" data-val="四国">徳島県</option>
  51. <option value="香川県" data-val="四国">香川県</option>
  52. <option value="愛媛県" data-val="四国">愛媛県</option>
  53. <option value="高知県" data-val="四国">高知県</option>
  54. <option value="福岡県" data-val="九州・沖縄">福岡県</option>
  55. <option value="佐賀県" data-val="九州・沖縄">佐賀県</option>
  56. <option value="長崎県" data-val="九州・沖縄">長崎県</option>
  57. <option value="熊本県" data-val="九州・沖縄">熊本県</option>
  58. <option value="大分県" data-val="九州・沖縄">大分県</option>
  59. <option value="宮崎県" data-val="九州・沖縄">宮崎県</option>
  60. <option value="鹿児島県" data-val="九州・沖縄">鹿児島県</option>
  61. <option value="沖縄県" data-val="九州・沖縄">沖縄県</option>
  62. </select>

JS

  1. var $children = $('.children'); //都道府県の要素を変数に入れます。
  2. var original = $children.html(); //後のイベントで、不要なoption要素を削除するため、オリジナルをとっておく
  3.  
  4. //地方側のselect要素が変更になるとイベントが発生
  5. $('.parent').change(function() {
  6.  
  7. //選択された地方のvalueを取得し変数に入れる
  8. var val1 = $(this).val();
  9.  
  10. //削除された要素をもとに戻すため.html(original)を入れておく
  11. $children.html(original).find('option').each(function() {
  12. var val2 = $(this).data('val'); //data-valの値を取得
  13.  
  14. //valueと異なるdata-valを持つ要素を削除
  15. if (val1 != val2) {
  16. $(this).not(':first-child').remove();
  17. }
  18.  
  19. });
  20.  
  21. //地方側のselect要素が未選択の場合、都道府県をdisabledにする
  22. if ($(this).val() == "") {
  23. $children.attr('disabled', 'disabled');
  24. } else {
  25. $children.removeAttr('disabled');
  26. }
  27.  
  28. });

Writer

KO

誕生日に会社のみんなから『世界文学全集』をプレゼントしてもらった読書好きフロントエンド・エンジニアです。WordPressとMovableTypeが得意ですが、本当の特技は薪割りです。

Contact

ご提案依頼、ご相談、お見積もりなど
お気軽にお問合わせください。

03-6868-4348

平日 10:00~19:00

「Web制作について」とお伝え頂ければ
担当者に取次させていただきます。

Mailform

contact@trym.jp
でも受け付けております。