質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

18255閲覧

選択済みのラジオボタンを押すと選択が解除される

alfa

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/04/12 07:56

###選択済みのラジオボタンを押すと選択が解除される
上記の通りの実装を考えております。下記のソースコードのようにラジオボタンが1セットのみでしたら、下記の通りのソースコードでも問題がないのですが、ラジオボタンのセットが30組近くある機能の中で、選択済みのラジオボタンを押すと選択が解除されるよう改修していくことになり、下記のようなソースコードだと、他のラジオボタンのセット(他のname)がある場合バグが生じてしまいます。例えば変数nowSelectedに1を保存し、他のセットのラジオボタンのvalue="1"のを選択したときなどです。これの対応策としてこちらのサイトの対応策も考慮しましたが、ラジオボタンのセットが30組近く考えると処理が重くなることが懸念され、できれば選択されているラジオボタンに値があっているかどうかだけで判断してラジオボタンをリセットしたいと思っているのですが、どう実装するべきか行き詰っています。もし他の解決策があった場合にも教えて頂けると嬉しいです。宜しくお願い致します。

###該当のソースコード

<label for="radio1"> <input type="radio" name="hogehoge" id="radio1" value="1"> <span>ラジオボタン1</span> </label> <label for="radio2"> <input type="radio" name="hogehoge" id="radio2" value="2"> <span>ラジオボタン2</span> </label> <label for="radio1"> <input type="radio" name="hogehoge" id="radio3" value="3"> <span>ラジオボタン3</span> </label> <label for="radio4"> <input type="radio" name="hogehoge" id="radio4" value="4"> <span>ラジオボタン4</span> </label> <script type="text/javascript"> var nowSelected = ''; $('input[type="radio"]').on('click', function(){ if (nowSelected === $(this).val()) { nowSelected = ''; $(this).prop('checked', false); } else { nowSelected = $(this).val(); } });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

複数ラジオボタングループ(name)に対応するために、nowSelectedをオブジェクトにすれば良いのではないでしょうか?名前はcheckedRadioValueにしていますが。

HTML

1<label for="hogehogeRadio1"> 2 <input type="radio" name="hogehoge" id="hogehogeRadio1" value="1"> 3 <span>ラジオボタン1</span> 4</label> 5<label for="hogehogeRadio2"> 6 <input type="radio" name="hogehoge" id="hogehogeRadio2" value="2"> 7 <span>ラジオボタン2</span> 8</label> 9<label for="hogehogeRadio3"> 10 <input type="radio" name="hogehoge" id="hogehogeRadio3" value="3"> 11 <span>ラジオボタン3</span> 12</label> 13<label for="hogehogeRadio4"> 14 <input type="radio" name="hogehoge" id="hogehogeRadio4" value="4"> 15 <span>ラジオボタン4</span> 16</label> 17 18<br> 19 20<label for="fooRadio1"> 21 <input type="radio" name="foo" id="fooRadio1" value="1"> 22 <span>ラジオボタン1</span> 23</label> 24<label for="fooRadio2"> 25 <input type="radio" name="foo" id="fooRadio2" value="2"> 26 <span>ラジオボタン2</span> 27</label> 28<label for="fooRadio3"> 29 <input type="radio" name="foo" id="fooRadio3" value="3"> 30 <span>ラジオボタン3</span> 31</label> 32 33<script type="text/javascript"> 34 // ラジオボタングループ(name)ごとにプロパティを定義、初期化しておく 35 var checkedRadioValue = { 'hogehoge': '', 'foo': '' }; 36 37 $('input[type="radio"]').on('click', function() { 38 var name = $(this).attr('name'); 39 var value = $(this).val(); 40 41 if (checkedRadioValue.name === value) { 42 checkedRadioValue.name = ''; 43 $(this).prop('checked', false); 44 } else { 45 checkedRadioValue.name = value; 46 } 47 }); 48</script>

せっかくベストアンサーに選んで頂きましたが、バグがありました。
お詫びして訂正します。

HTML

1<label for="hogehogeRadio1"> 2 <input type="radio" name="hogehoge" id="hogehogeRadio1" value="1"> 3 <span>ラジオボタン1</span> 4</label> 5<label for="hogehogeRadio2"> 6 <input type="radio" name="hogehoge" id="hogehogeRadio2" value="2"> 7 <span>ラジオボタン2</span> 8</label> 9<label for="hogehogeRadio3"> 10 <input type="radio" name="hogehoge" id="hogehogeRadio3" value="3"> 11 <span>ラジオボタン3</span> 12</label> 13<label for="hogehogeRadio4"> 14 <input type="radio" name="hogehoge" id="hogehogeRadio4" value="4"> 15 <span>ラジオボタン4</span> 16</label> 17 18<br> 19 20<label for="fooRadio1"> 21 <input type="radio" name="foo" id="fooRadio1" value="1"> 22 <span>ラジオボタン1</span> 23</label> 24<label for="fooRadio2"> 25 <input type="radio" name="foo" id="fooRadio2" value="2"> 26 <span>ラジオボタン2</span> 27</label> 28<label for="fooRadio3"> 29 <input type="radio" name="foo" id="fooRadio3" value="3"> 30 <span>ラジオボタン3</span> 31</label> 32 33<script type="text/javascript"> 34 // ラジオボタングループ(name)ごとにプロパティを定義、初期化しておく 35 var checkedRadioValue = { 'hogehoge': '', 'foo': '' }; 36 37 $('input[type="radio"]').on('click', function() { 38 var name = $(this).attr('name'); 39 var value = $(this).val(); 40 41 if (checkedRadioValue[name] === value) { 42 checkedRadioValue[name] = ''; 43 $(this).prop('checked', false); 44 } else { 45 checkedRadioValue[name] = value; 46 } 47 }); 48</script> 49</body>

checkedRadioValue.name → checkedRadioValue[name]

投稿2017/04/23 09:04

編集2018/03/24 20:55
naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やりたいことは

  • 選択済みのラジオボタンをクリックすると、そのグループでの選択を解除する(どれも選択されていない状態にする)
  • ただし他のグループには影響を与えてはいけない

ですよね。

ということは、click のイベントハンドラで、
「自分が既に選択状態だったら、自分の選択状態を解除する」
すなわち

javascript

1 if ($(this).prop('checked') == true) { 2 $(this).prop('checked', false); 3 }

じゃいけないんでしょうか。

投稿2017/04/12 08:09

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

直前のチェック状態を保持しておいて、ラジオボタンのクリック時には「直前のチェック状態がチェック済み」であればチェック解除をを行うようにしてはどうでしょうか?

html

1<html> 2<head> 3<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 4<script> 5 6function savePreChecked(name) { 7 var selector = "input:radio"; 8 if (name) { selector += "[name='" + name + "']"; } 9 $(selector).each(function(){ this.preChecked = this.checked; }); 10} 11 12$(function() { 13 savePreChecked(); 14 $("input:radio").on("click", function() { 15 if (this.preChecked == true) { 16 this.checked = false; 17 } 18 savePreChecked(this.name); 19 }); 20}); 21 22</script> 23</head> 24<body> 25 26<div id="group1"> 27 <input type="radio" name="rdoGroup1"> 28 <input type="radio" name="rdoGroup1"> 29 <input type="radio" name="rdoGroup1"> 30</div> 31 32<div id="group2"> 33 <input type="radio" name="rdoGroup2"> 34 <input type="radio" name="rdoGroup2"> 35 <input type="radio" name="rdoGroup2"> 36</div> 37 38<div id="group3"> 39 <input type="radio" name="rdoGroup3"> 40 <input type="radio" name="rdoGroup3"> 41 <input type="radio" name="rdoGroup3"> 42</div> 43 44</body> 45</html>

投稿2017/04/12 08:43

編集2017/04/12 09:21
ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sha

2017/04/12 09:02

質問で処理が重くなることを懸念されているので、clickイベント内のsavePreCheckedは別関数としてループを対象nameの要素のみにしてはどうでしょうか
ku__ra__ge

2017/04/12 09:16

重くなるのでは?という懸念があるようなのでクリック時の直前状態保持は、同じ名前のラジオボタンに限るようにしました。
guest

0

if ($(this).prop('checked') == true) { $(this).prop('checked', false); }

ではクリックして選択された状態になることがないので
参考にされたサイトのように各nameごとの選択中の値をどこかに保持するのが良いと思います。
30×4程度ならそこまで重くならない(mac + Chromeで検証しました)と思います。

投稿2017/04/12 08:24

sha

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2017/04/12 09:05

そういえばそうですね。click に飛んできた時点で元がどちらであっても checked == true になってるから、必ず false になってしまうか。
sha

2017/04/12 09:06

そうですね。onmouseupであらかじめ変更前の値をとる方法もあるかもしれませんがバインドするイベントが増えますし、参考サイト通りで問題ないと思いました。
guest

0

参考リンクの通りにやったらうまく機能しませんでした。
7行目を "input.prop('checked', false);" とすることでうまく機能しました。

投稿2017/04/12 08:35

編集2017/04/12 08:36
larkpia

総合スコア138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問