【JavaScript】セレクトボックス未選択を防ぐ方法|2つの項目どちらも未選択ならエラーにする
フォームを作っているとよくあるのが、
- セレクトボックスを用意したけど未選択のまま送信される
- 「選択してください」のまま送られてしまう
という問題です。
特に、
「2つの選択肢のうちどちらかは選んでほしい」
というケースでは、少し工夫が必要になります。
この記事では、
2つのセレクトボックスが両方とも未選択だった場合にエラーにする方法を解説します。
よくあるフォームの構成
まずは一般的な例です。
<select id="sampleSelect1">
<option value="default">選択してください</option>
<option value="option1">パターンA</option>
<option value="option2">パターンB</option>
</select>
<select id="sampleSelect2">
<option value="default">選択してください</option>
<option value="option1">パターンA</option>
<option value="option2">パターンB</option>
</select>この状態だと、ユーザーが何も選ばなくても送信できてしまいます。
実現したい動き
今回やりたいのはこれです。
- どちらも未選択 → エラー
- どちらか1つでも選択 → OK
JavaScriptでの実装
以下のコードを追加するだけでOKです。
<script>
document.addEventListener('DOMContentLoaded', function () { const selectA = document.getElementById('sampleSelect1');
const selectB = document.getElementById('sampleSelect2'); const form = selectA.closest('form'); form.addEventListener('submit', function (e) { const valueA = selectA.value;
const valueB = selectB.value; // 両方とも未選択の場合
if (valueA === 'default' && valueB === 'default') {
e.preventDefault();
alert('どちらか1つは選択してください');
selectA.focus();
} });});
</script>
ポイント解説
① valueを統一する
<option value="default">選択してください</option>
ここが重要です。
表示テキストではなく、
valueで判定するのが正解です。
② formに対してsubmitイベントを設定
form.addEventListener('submit', function (e) {これにより、
送信ボタンが押された瞬間にチェックできます。
③ 送信を止める
e.preventDefault();
これがないとエラー表示しても送信されてしまいます。
よくあるミス
テキストで判定してしまう
if (selectA.textContent === '選択してください')
→ NGです
理由:HTML構造によって取得値が変わるため
hiddenのselectをそのままチェック
もし片方のselectが非表示の場合は注意です。
display: none;
この場合でも値は取得されるので、
必要に応じて条件分岐を追加してください。
応用:非表示の時はチェックしない
const isVisible = selectB.offsetParent !== null;if (valueA === 'default' && (!isVisible || valueB === 'default')) {
e.preventDefault();
alert('選択してください');
}まとめ
今回のポイントを整理すると:
- セレクトボックスは value で判定する
- submitイベントでチェックする
- preventDefaultで送信を止める
- 複数項目の組み合わせチェックも可能
最後に
このようなバリデーションは、
- 問い合わせフォーム
- 予約フォーム
- ECサイトのオプション選択
など、かなり多くの場面で使えます。
「入力ミスを減らす」=「CVR改善」に直結するので、
細かいですがしっかり実装しておくのがおすすめです。


