64
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

2つのセレクトボックスを連動させるjQuery

Posted at

やりたいこと

2つのselect要素を連動させる。
1つめの選択肢を選ぶと、2つめの選択肢が動的に変わる。

色々なサイトを見てみたが、スマホだとうまく動かないコードがあったりした。
こちらのコードがシンプルでいい感じ。
プラグイン不要! jQueryで複数のセレクトボックスの選択肢を連動させる

ほぼ上記サイト通りだが、optgroupを使いたかったので少しだけ変更した。
動作デモ

HTML

1つめのセレクトボックス
selectにparent、初期値になるoptionにはmsgというクラスをつけておく。

<select class="parent" name="日付" required>
 <option value="" class="msg" disabled selected>-----日付を選択-----</option>
 <option value="1/11(水)">1/11(水)</option>
 <option value="2/5(日)">2/5(日)</option>
 <option value="3/3(金)">3/3(金)</option>
</select>

2つめのセレクトボックス
selectのクラスはchildren
data-valに1つめのvalueに対応する値を入れる。

<select class="children" name="講座名" disabled required>
 <option value="" class="msg" disabled selected>-----講座名を選択-----</option>
 <optgroup label="音楽">
  <option value="餅つき大会" data-val="1/11(水)">餅つき大会</option>
  <option value="音楽理論" data-val="1/11(水)">音楽理論</option>
  <option value="エレキギター講座" data-val="1/11(水)">エレキギター講座</option>
  <option value="エレキギター講座" data-val="2/5(日)">エレキギター講座</option>
  <option value="ドラム講座" data-val="2/5(日)">ドラム講座</option>
  <option value="エレキベース講座" data-val="3/3(金)">エレキベース講座</option>
  <option value="ボイストレーニング" data-val="3/3(金)">ボイストレーニング</option>
 </optgroup>
 <optgroup label="ウェブ">
  <option value="HTMLとCSS" data-val="1/11(水)">HTMLとCSS</option>
  <option value="JavaScript" data-val="1/11(水)">JavaScript</option>
  <option value="HTMLとCSS" data-val="2/5(日)">HTMLとCSS</option>
  <option value="PHP" data-val="2/5(日)">PHP</option>
  <option value="Qiita" data-val="3/3(金)">Qiita</option>
 </optgroup>
</select>

#JavaScript(jQuery)
ほぼ参考サイト通り。変更したのは、.not()のところ。

$(function() {
  var $children = $('.children');
  var original = $children.html();

  $('.parent').change(function() {
    var val1 = $(this).val();

    $children.html(original).find('option').each(function() {
      var val2 = $(this).data('val');
      if (val1 != val2) {
        $(this).not('optgroup,.msg').remove();
      }
    });

    if ($(this).val() === '') {
      $children.attr('disabled', 'disabled');
    } else {
      $children.removeAttr('disabled');
    }

  });
});
64
77
1

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
64
77

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?