JavaScriptの学習 セレクトボックスのメニューをラジオボタンで制御

2022/12/09

JavaScript

目次
JavaScript セレクトボックス ラジオボタン

ラジオボタンの選択に合わせてセレクトボックスのメニュー表示を変更したい

ウェブサイトを作成していて、ラジオボタンの選択に合わせてセレクトボックスのメニュー表示を変更したい、と思ったことはないでしょうか。

私はその思いに遭遇し、早速やり方を調べてみました。

ラジオボタンの選択でセレクトボックスのメニュー表示をオン/オフ制御する方法

ラジオボタンの選択でセレクトボックスのメニュー表示をオン/オフ制御するには、次に示すHTMLとJavaScriptで実現することができます。

動作確認

ラジオボタン Type-1 Type-2

セレクトメニュー


HTMLソースコード

<p>
  ラジオボタン
  <input type="radio" name="RADIO_ONOFF" value="1" onclick="SelBoxOnOff()">Type-1
  <input type="radio" name="RADIO_ONOFF" value="2" onclick="SelBoxOnOff()" checked>Type-2
</p>

<p>
  セレクトメニュー
  <select id="SELECT_ONOFF" name="SELECT_ONOFF">
    <option value="1">ラジオボタンで制御</option>
    <option value="VA">A</option>
    <option value="VB">B</option>
  </select>
</p>
ラジオボタンを構成する行番号3~4では、onclickパラメータにJavaScript関数SelBoxOnOff()を設定しています。

この結果、ラジオボタンがクリックされるとJavaScript関数SelBoxOnOff()が実行されます。

JavaScriptソースコード

// セレクトボックス メニュー 表示/非表示
function SelBoxOnOff() {
  // ラジオボタンの情報を取得
  const MyButton = document.getElementsByName('RADIO_ONOFF');

  if (MyButton[0].checked) {
    // セレクトボックスのメニュー表示をオン
    document.getElementById('SELECT_ONOFF').style.display = "none";
  } else {
    // セレクトボックスのメニュー表示をオフ
    document.getElementById('SELECT_ONOFF').style.display = "";
  }
}

// 全ページデータ読み込み完了後にイベントハンドラを登録
window.addEventListener('load', SelBoxOnOff());
JavaScriptソースコードのポイントを以下に記載します。

行番号2~13は、関数SelBoxOnOff()の動作を記述しています。

行番号4では、ラジオボタンのHTMLタグ情報を抽出しています。

行番号6~12では、ラジオボタンのチェック状態に基づいてセレクトボックスのメニュー表示制御を記述しています。

行番号8では、セレクトボックスのメニュー表示を無効化しています。

行番号11では、セレクトボックスのメニュー表示を有効化しています。

行番号16では、ウェブサイトの全データ読み込みが完了後に関数SelBoxOnOff()をイベントハンドラに追加しています。

ラジオボタンの選択でセレクトボックスのメニュー表示内容を変更する方法

ラジオボタンの選択でセレクトボックスのメニュー表示内容を変更するには、次に示すHTMLとJavaScriptで実現することができます。

動作確認

ラジオボタン Type-1 Type-2

セレクトメニュー


HTMLソースコード

<p>
  ラジオボタン
  <input type="radio" name="RADIO_CONT" value="1" onclick="SelBoxMenuChange()" checked>Type-1
  <input type="radio" name="RADIO_CONT" value="2" onclick="SelBoxMenuChange()">Type-2
</p>

<p>
  セレクトメニュー
  <select id="SELECT_CONT" name="SELECT_CONT">
  </select>
</p>
ラジオボタンを構成する行番号3~4では、onclickパラメータにJavaScript関数SelBoxMenuChange()を設定しています。

この結果、ラジオボタンがクリックされるとJavaScript関数SelBoxMenuChange()が実行されます。

JavaScriptソースコード

// セレクトボックス メニュー リスト変更
function SelBoxMenuChange() {
  // メニューリスト1
  const MyMenu1 = [
    ['1', 'ラジオボタンで制御1'],
    ['VA', 'A'],
    ['VB', 'B']
  ];

  // メニューリスト2
  const MyMenu2 = [
    ['2', 'ラジオボタンで制御2'],
    ['VX', 'X'],
    ['VY', 'Y']
  ];

  // ラジオボタンの情報を取得
  const MyButton = document.getElementsByName('RADIO_CONT');

  // セレクトボックスの情報を取得
  let MySelBox = document.getElementById('SELECT_CONT');

  // メニューリスト設定: ラジオボタン1がチェックされた場合
  let TmpMenu = MyMenu1;
  // メニューリスト設定: ラジオボタン2がチェックされた場合
  if (MyButton[1].checked) {TmpMenu = MyMenu2;}

  // 古いメニューリストを削除
  while (MySelBox.length) {
    MySelBox.remove(0);
  }

  // メニューリストを作成
  TmpMenu.forEach((element) => {
    // OPTIONタグを生成
    let TmpOpt = document.createElement('option');
    TmpOpt.value = element[0];
    TmpOpt.text = element[1];

    // セレクトボックスに新しいメニューリストを追加
    MySelBox.appendChild(TmpOpt);
  });
}

// 全ページデータ読み込み完了後にイベントハンドラを登録
window.addEventListener('load', SelBoxMenuChange());
JavaScriptソースコードのポイントを以下に記載します。

行番号2~43は、関数SelBoxMenuChange()の動作を記述しています。

行番号4~8では、セレクトボックスのメニューリスト1を定義しています。

行番号11~15では、セレクトボックスのメニューリスト2を定義しています。

行番号18では、ラジオボタンのHTMLタグ情報を抽出しています。

行番号21では、セレクトボックスのHTMLタグ情報を抽出しています。

行番号24では、表示すべきセレクトボックスのメニューリストとして、メニューリスト1を代入しています。

行番号26では、2つ目のラジオボタンがチェックされていた場合に、表示すべきセレクトボックスのメニューリストとして、メニューリスト2を代入しています。

行番号29~31では、現状のセレクトボックスに設定されているメニューリストを削除しています。

行番号34~42では、セレクトボックスに新しいメニューリストを追加しています。
行番号34から42の処理は、メニューリストの要素数だけ繰り返します。
(メニューリストの要素数は3つですので、3回繰り返されます。)

行番号36では、新規にOPTIONタグを定義しています。

行番号37~38では、行番号36で定義したOPTIONタグのValue要素とText要素に、行番号24~26で設定した新しいメニューリストの要素を代入しています。

行番号41では、セレクトボックスの子要素として、行番号36~38で定義、作成したOPTIONタグを追加しています。

行番号16では、ウェブサイトの全データ読み込みが完了後に関数SelBoxOnOff()をイベントハンドラに追加しています。

ハマりました

JavaScriptにてメニューリストを作成する処理(行番号34~42)でハマってしまいました。

アレコレ試した結果、動作するソースコードと動作しないソースコードを次に記載します。

動作するソースコード
  // メニューリストを作成
  TmpMenu.forEach((element) => {
    // セレクトボックスに新しいメニューリストを追加
    MySelBox.options[MySelBox.options.length] = new Option(element[1], element[0]);
  });
先のJavaScriptソースコードにおけるメニューリストを作成する処理(行番号34~42)を上記に置き換えても正常に動作します。

コード量が削減された分、記述が多少複雑化しています。

ソースコードの意味は、セレクトボックスのオプションを追加する際に、インデックス番号を指定し、オプションの要素を代入しています。

動作しないソースコード
  // OPTIONタグを生成
  let TmpOpt = document.createElement('option');

  // メニューリストを作成
  TmpMenu.forEach((element) => {
    TmpOpt.value = element[0];
    TmpOpt.text = element[1];

    // セレクトボックスに新しいメニューリストを追加
    MySelBox.appendChild(TmpOpt);
  });
先のJavaScriptソースコードにおけるメニューリストを作成する処理(行番号34~42)を上記に置き換えると正常に動作しなくなります。

新規に生成したOPTIONタグの変数TmpOptをセレクトボックスの子要素として追加しているつもりだったのですが、実際の動作では、メニューリストの最後の1つだけが要素として追加されました。

自己紹介

自分の写真
株式トレード歴は15年以上、専業株式トレーダーになって5年以上、今も現役で活動中

Blogger. | Designed by QooQ.