We Blog Weblog

連動する2つのセレクトボックス

Web

2024年10月15日

みなさんこんにちは。
ケミストのWeb担当みやのです。

「Web」記事では、これまでに得たWebに関する知識を記録として残していきたいと思います。

今回は「連動するセレクトボックス」を作ってみました。

1番目の選択結果で2番目の選択肢が変化

1番目のセレクトボックスで地方(北海道、東北、関東、中部、近畿、中国、四国、九州)を選ぶと、2番目のセレクトボックスには1番目で選んだ地方に属する都道府県が表示される、という風にしてみます。

ちなみにこの「八地方区分」に法律上の明確な定義はないそうです。中国地方と四国地方をまとめて「中国・四国地方」にした「七地方区分」とする場合もあるようです。

まずselectを2つ設置し、IDをそれぞれregion、prefectureとします。

1番目のselectにonchange="updatePrefectures()"と記述します。

1番目のselectのoptionは空のvalue+地方名、2番目のselectのoptionは空のvalue1つだけを入れておきます。

<select id="region" onchange="updatePrefectures()">
  <option value="" selected></option>
  <option value="北海道地方">北海道地方</option>
  <option value="東北地方">東北地方</option>
  <option value="関東地方">関東地方</option>
  <option value="中部地方">中部地方</option>
  <option value="近畿地方">近畿地方</option>
  <option value="中国地方">中国地方</option>
  <option value="四国地方">四国地方</option>
  <option value="九州地方">九州地方</option>
</select>

<select id="prefecture">
  <option value="" selected></option>
</select>

スクリプトに地方と都道府県を書いていきます。

function updatePrefectures() {
  const prefectures = {
    "北海道地方": ["北海道"],
    "東北地方": ["青森県", "岩手県", "宮城県", "秋田県",  "山形県", "福島県"],
    "関東地方": ["茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県"],          
    "中部地方": ["新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県"],
    "近畿地方": ["三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県"],
    "中国地方": ["鳥取県", "島根県", "岡山県", "広島県", "山口県"],
    "四国地方": ["徳島県", "香川県", "愛媛県", "高知県"],
    "九州地方": ["福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"]
  };
  const region = document.getElementById("region").value;
  const prefectureSelect = document.getElementById("prefecture");
  prefectureSelect.innerHTML = "";
  if (region) {
    prefectures[region].forEach(function(prefecture) {
      let option = document.createElement("option");
      option.value = prefecture;
      option.text = prefecture;
      prefectureSelect.appendChild(option);
    });
  }
}

本当は都道府県と市町村でやりたかったのですが、市町村って1700くらいあるそうなので今回はやめておきます><

1番目で選択した項目が2番目の選択肢から消える

仮に、選択肢が5個あるとして(A、B、C、D、E)そこから重複しない2つを選ぶとします。

1番目のセレクトボックスから選択後、2番目のセレクトボックスの選択肢がそれを除く4つに変化する、という風に作ってみます。

まずselectを2つ用意し、ID、onchange、optionを設定します。

<select id="firstSelect" onchange="updateSelectBoxes('firstSelect')">
  <option value="">選択してください</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="E">E</option>
</select>

<select id="secondSelect" onchange="updateSelectBoxes('secondSelect')">
  <option value="">選択してください</option>
  <option value="A">A</option>
  <option value="B">B</option>
  <option value="C">C</option>
  <option value="D">D</option>
  <option value="E">E</option>
</select>

スクリプトを記述します。

2番目を先に選んでもちゃんと1番目の選択肢が変化します。

const options = ["A", "B", "C", "D", "E"];
function updateSelectBoxes(changedSelectId) {
  const firstSelect = document.getElementById("firstSelect");
  const secondSelect = document.getElementById("secondSelect");
  const firstSelectValue = firstSelect.value;
  const secondSelectValue = secondSelect.value;
  if (changedSelectId === "firstSelect") {
    updateOptions(secondSelect, firstSelectValue);
    secondSelect.value = secondSelectValue !== firstSelectValue ? secondSelectValue : "";
  } else if (changedSelectId === "secondSelect") {
    updateOptions(firstSelect, secondSelectValue);
    firstSelect.value = firstSelectValue !== secondSelectValue ? firstSelectValue : "";
  }
}
function updateOptions(selectElement, selectedValue) {
  selectElement.innerHTML = "<option value=''>選択してください</option>";
  options.forEach(option => {
    if (option !== selectedValue) {
      let opt = document.createElement("option");
      opt.value = option;
      opt.text = option;
      selectElement.appendChild(opt);
    }
  });
}

まとめ

セレクトボックス

選択肢を増やせば、仮面ラ〇ダービ〇ドのフルボトルに応用できますね!勝利の法則は決まった!

つかめ!最高のガッチャ!

ベストマッチ!Are you ready?

変身!

ビルドアップ!

鋼のムーンサルト!ラビットタンク!

輝きのデストロイヤー!ゴリラモンド!

天空の暴れん坊!ホークガトリング!

忍びのエンターテイナー!ニンニンコミック!

ぶっ飛びモノトーン!ロケットパンダ!

レスキュー剣山!ファイヤーヘッジホッグ!

たてがみサイクロン!ライオンクリーナー!

封印のファンタジスタ!キードラゴン!

定刻の反逆者!海賊レッシャー!

稲妻テクニシャン!オクトパスライト!

不死身の兵器!フェニックスロボ!

繋がる一匹狼!スマホウルフ!

情熱の扇風機!ローズコプター!

未確認ジャングルハンター!トラユーフォー!

天駆けるビッグウェーブ!クジラジェット!

嵐を呼ぶ巨塔!キリンサイクロン!

イエーイ!

イエイ!

イエァ!

イエイィ!

イエェイィ!

イエェイ!

イエェア!

イェエイ!

イエアァ!

イェーイィ!

イェイィ…!

イェアァァ!

イェエイ!

イエェア!

イエェェア!

イエェェイ!

この記事を書いた人
みやの
Web・DTP担当

Contact Us

ご意見、ご相談、料金のお見積もりなど、お気軽にお問い合わせください。

お問い合わせはこちら

TOP