CheckBoxについて質問させて頂きます。『HTML』と『JavaScript』で作成しています。今回は4つ選択の中で『必ず2つ選択してください。』としています。必ず2つ選択をした後に確認ボタンを押すとページ遷移と、フォームの送信がされてそれ以外(2つ選択以外)は確認ボタンを押してもページ遷移や、フォームの送信を停止させたいです。・4つ選択の中で2つ選択した後に1つCheckを外して確認ボタンを押してもページ遷移と、フォームの送信がされてしまいます。・4つ選択の中で2つ選択した後に全部のCheckを外して確認ボタンを押してもページ遷移と、フォームの送信がされてしまいます上記の2つをどの様にコーディングするとページ遷移と、フォームの送信を停止させることが出来るのでしょうか?下記にコードを記載します\u0026lt;HTML\u0026gt;\u0026lt;form action=\u0026quot;https://codepen.io/alshark/pen/KwVYLyK\u0026quot; method=\u0026quot;get\u0026quot; target=\u0026quot;_blank\u0026quot; rel=\u0026quot;noopener noreferrer\u0026quot; id=\u0026quot;form3\u0026quot; name=\u0026quot;form3\u0026quot;\u0026gt; \u0026lt;div id=\u0026quot;checkbox-flex-container\u0026quot;\u0026gt;お好きな果物を必ず2つ選択してください。 \u0026lt;label for=\u0026quot;strawberry\u0026quot;\u0026gt; \u0026lt;input type=\u0026quot;checkbox\u0026quot; name=\u0026quot;fruit\u0026quot; value=\u0026quot;\u0026quot; id=\u0026quot;strawberry\u0026quot;\u0026gt;いちご \u0026lt;/label\u0026gt; \u0026lt;label for=\u0026quot;melon\u0026quot;\u0026gt; \u0026lt;input type=\u0026quot;checkbox\u0026quot; name=\u0026quot;fruit\u0026quot; value=\u0026quot;\u0026quot; id=\u0026quot;melon\u0026quot;\u0026gt;メロン \u0026lt;/label\u0026gt; \u0026lt;label for=\u0026quot;kiwi-fruit\u0026quot;\u0026gt; \u0026lt;input type=\u0026quot;checkbox\u0026quot; name=\u0026quot;fruit\u0026quot; value=\u0026quot;\u0026quot; id=\u0026quot;kiwi-fruit\u0026quot;\u0026gt;キウイフルーツ \u0026lt;/label\u0026gt; \u0026lt;label for=\u0026quot;apple\u0026quot;\u0026gt; \u0026lt;input type=\u0026quot;checkbox\u0026quot; name=\u0026quot;fruit\u0026quot; value=\u0026quot;\u0026quot; id=\u0026quot;apple\u0026quot;\u0026gt;りんご \u0026lt;/label\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;a href=\u0026quot;https://codepen.io/alshark/pen/KwVYLyK\u0026quot;\u0026gt; \u0026lt;button id=\u0026quot;button3\u0026quot;\u0026gt;確認\u0026lt;/button\u0026gt; \u0026lt;/a\u0026gt;\u0026lt;/form\u0026gt;\u0026lt;JavaScript\u0026gt;const button3 = document.querySelector('#button3');const form3 = document.querySelector('#form3');const fruitCheckBoxs = document.getElementsByName('fruit');const maxChecksFruit = 2;document.addEventListener('DOMContentLoaded', () =\u0026gt; { fruitCheckBoxs.forEach(function(fruitCheckBox) { fruitCheckBox.addEventListener('change', function() { let checkedCount = 0; fruitCheckBoxs.forEach((cb) =\u0026gt; { if (cb.checked) { checkedCount++; } }); console.log(checkedCount); console.log(maxChecksFruit); if (checkedCount \u0026gt; maxChecksFruit) { console.log('同じ数で無かった場合'); this.checked = false; checkedCount--; console.log(checkedCount); console.log(maxChecksFruit); button3.addEventListener('click', () =\u0026gt; { form3.submit(); }); 以降補足情報に記載します

JavaScriptApple

1件の回答

回答を書く

1141818

2026-01-27 07:00

+ フォロー

修正してみました。

er8.s323.xrea.com/checkbox001.html



元コードはイベントの重複や制御不十分で誤動作しやすい。完成版はイベントを整理して送信制御と選択制限を明確にした。





元のコードの問題点



イベントの重複登録

チェックボックスの変更ごとに button3.addEventListener('click', …) を追加

クリックイベントが何重にも登録され、フォーム送信やページ遷移が意図せず発生

送信制御が不十分

チェック数が2でない場合でも event.preventDefault() が適切に効かず、送信されてしまう

HTML構造の問題

\u0026lt;a\u0026gt; タグで \u0026lt;button\u0026gt; を囲んでいるため、ブラウザによって挙動が不安定

チェック数制限の不安定さ

2つ以上の選択時に自動解除はあるが、イベント重複で正しく動作しないことがある

可読性・保守性の低さ

イベントが散在し、どこで送信制御されているか分かりづらい





完成版の改善点



イベント管理の整理

フォーム送信イベントとチェックボックス変更イベントをそれぞれ1回だけ登録

送信制御の一元化

form.addEventListener('submit', …) で必ずチェック数を確認し、条件未達なら送信停止

チェック数制限の明確化

2つ以上を選択しようとした場合、自動でチェック解除しユーザーに警告

HTML構造の改善

\u0026lt;a\u0026gt; タグを削除、ボタンは \u0026lt;button type=\u0026quot;submit\u0026quot;\u0026gt; のみで送信制御

可読性向上

条件判定やチェック数カウントを簡潔にまとめ、バグや重複イベントを回避

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有