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

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

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

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

Q&A

解決済

3回答

5925閲覧

ラジオボタンのalertのコントロール

leoairen

総合スコア122

JavaScript

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

0グッド

0クリップ

投稿2016/06/02 01:35

初心者で、javascriptでラジオボタンが選択されないときはalertを出さず、すでに選択されている場合で、違うボタンに変更するときにはalertを出すにはどう書けばよいか教えて頂けますでしょうか。

下記は書いてみたコードです。

<script> var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); function janid(){ if (goods1.value=="" && goods2.value=="" && goods3.value==""){ return false; }else { alert("商品の種類を変更しました"); } } </script> <table> <td><label> <input type="radio" id="goods1" name="goods1" value="1" onClick="return goods()"> <span>商品1</span></label> <label> <input type="radio" id="goods2" name="goods2" value="2" onClick="return goods()"> <span>商品2</span></label> <label> <input type="radio" id="goods3" name="goods3" value="3" onClick="return goods()"> <span>商品3</span></label> </td> </table>

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

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

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

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

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

coco_bauer

2016/06/02 02:07

質問のHTMLでは、ラジオボタンの正しい記述になっていません。ラジオボタンというのは複数のマークできるボタンを組にしたもので、その中で1つだけを選択することができるボタンです。別のボタンがくりっくすされると、そのボタンがマークされて、以前にマークされていたボタンのマークは消えます。同じnameの値をもつボタンが組になります。質問のコードのように、個々のラジオボタンのnameが異なっていてはラジオボタンとして機能しません。
kei344

2016/06/02 02:30

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「</>」ボタンを押すとコードブロックになります。
guest

回答3

0

ベストアンサー

まず、onClickで呼び出している関数が存在しません。
あなたが定義した関数名はjanidですが、onClickで呼び出している関数はgoodsです。

<input type="radio" id="goods1" name="goods1" value="1" onClick="return janid()"> <input type="radio" id="goods2" name="goods2" value="2" onClick="return janid()"> <input type="radio" id="goods3" name="goods3" value="3" onClick="return janid()">

次に、ラジオボタンとしてグルーピングできていないので、
商品1、商品2、商品3すべてにチェックマークがつけれる状態になっています。
ラジオボタンをグルーピングする場合、nameは全て統一しなければいけません。

<input type="radio" id="goods1" name="goods" value="1" onClick="return janid()"> <input type="radio" id="goods2" name="goods" value="2" onClick="return janid()"> <input type="radio" id="goods3" name="goods" value="3" onClick="return janid()">

次に、getElementByIdでそれぞれのラジオボタンのオブジェクトを取得していますが、
ブラウザによってはこのやり方ではnullが入っています。
全体の処理をwindow.onload時に実行する等工夫が必要です。

window.onload = function() { // この中に処理を書かないと、IDでオブジェクトを引くことができない可能性がある }

次に、ラジオボタンの選択状態はvalueでみるのではなくcheckedです。

if (!goods1.checked && !goods2.checked && !goods3.checked){

最後に、そもそもonClickはcheckedが切り替わった「後」に呼ばれるので、
そのタイミングで「どれも選択されていない」判定をしても無駄です。
「どれも選択されていない」かどうかを保持する変数を用意する必要があります。

以上のことを踏まえ、以下のように変更してみてはいかがでしょう。

<script> var check = function(){ if(selected) { alert("商品の種類を変更しました"); } selected = true; }; var goods1 = null; var goods2 = null; var goods3 = null; var selected = false; window.onload = function(){ goods1 = document.getElementById("goods1"); goods2 = document.getElementById("goods2"); goods3 = document.getElementById("goods3"); selected = false; }; </script> <table> <td><label> <input type="radio" id="goods1" name="goods" value="1" onClick="check()"> <span>商品1</span></label> <label> <input type="radio" id="goods2" name="goods" value="2" onClick="check()"> <span>商品2</span></label> <label> <input type="radio" id="goods3" name="goods" value="3" onClick="check()"> <span>商品3</span></label> </td> </table>

投稿2016/06/02 02:02

編集2016/06/02 02:14
masaya_ohashi

総合スコア9206

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

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

leoairen

2016/06/02 02:19

ご回答、ありがとうございます。 もし仮に商品1が選択されてあって、商品2や3をクリックして再度商品1を選択した場合はalertを出さないようにするにはどうすればよろしいでしょうか。
masaya_ohashi

2016/06/02 02:44

一度でも選択した商品に戻したとき、alertを出さない、ということでしょうか? そのためには一度選択したものを記憶しておく必要があります。 いまのonClickのやり方だと、なにがクリックされたか不明なので、 addEventListenerを使うやり方に変更する必要があります。 上記をもとにコードを変更してみました。 ``` var check = function(){ // 選択したことがあるリストから探す for(var i=0;i<selected.length;i++) { var obj = selected[i]; if(obj == this) { // すでに一度選択したことがある return; } } // 一度以上選択された if(selected.length > 0) { alert("商品の種類を変更しました"); } // 選択したことがあるリストに追加する selected.push(this); }; var goods1 = null; var goods2 = null; var goods3 = null; var selected = []; window.onload = function(){ goods1 = document.getElementById("goods1"); goods2 = document.getElementById("goods2"); goods3 = document.getElementById("goods3"); selected = []; goods1.addEventListener("click", check); goods2.addEventListener("click", check); goods3.addEventListener("click", check); }; ```
leoairen

2016/06/06 07:13

ご回答、ありがとうございました。 下記のように書きましたらできました。 <script> var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); function janid(){ if (goods1.checked || goods2.checked || goods3.checked){ return false; }else { alert("商品の種類を変更しました"); } } </script>
guest

0

以下のようにするべきだと思います。
ラジオボタンがチェックされているかを取得するにはcheckedプロパティを用います。

javascript

1var goods1 = document.getElementById("goods1"); 2var goods2 = document.getElementById("goods2"); 3var goods3 = document.getElementById("goods3"); 4 5function janid(){ 6 if (!goods1.checked && !goods2.checked && !goods3.checked){ 7 return false; 8 }else if (goods1.checked || goods2.checked || goods3.checked){ 9 alert("商品の種類を変更しました"); 10 } 11} 12

HTML

html

1 2<table> 3<td><label> 4<input type="radio" id="goods1" name="goods" value="1" onClick="return goods()"> 5<span>商品1</span></label> 6<label> 7<input type="radio" id="goods2" name="goods" value="2" onClick="return goods()"> 8<span>商品2</span></label> 9<label> 10<input type="radio" id="goods3" name="goods" value="3" onClick="return goods()"> 11<span>商品3</span></label> 12</td> 13</table>

投稿2016/06/02 02:07

orange0190

総合スコア1698

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

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

leoairen

2016/06/06 07:12

ご回答、ありがとうございました。 下記のように書きましたらできました。 <script> var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); function janid(){ if (goods1.checked || goods2.checked || goods3.checked){ return false; }else { alert("商品の種類を変更しました"); } } </script>
guest

0

そもそもHTMLでのラジオボタンの実装に認識違いがありそうです。
今回のように選択肢が3つある場合、ラジオボタンではどれか一つが選択できるということです。

商品1を選択した状態。
◎商品1 ○商品2 ○商品3

商品2を選択した状態。
○商品1 ◎商品2 ○商品3

そのためにはラジオボタンを同じnameでグループ化する必要があります。
今のコードではnameがそれぞれgoods1~3になっており、グループ化できていないと思います。

投稿2016/06/02 01:53

ttyp03

総合スコア16998

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

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

leoairen

2016/06/02 01:56

ご回答、ご指摘、ありがとうございます。 下記のように変更しましたが、起動しませんでした。 <script> var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); function janid(){ if (goods1.value=="" && goods2.value=="" && goods3.value==""){ return false; }else if (goods1.value==0 || goods2.value==1 || goods3.value==2){ alert("商品の種類を変更しました"); } } </script> <table> <td><label> <input type="radio" id="goods1" name="goods" value="1" onClick="return goods()"> <span>商品1</span></label> <label> <input type="radio" id="goods2" name="goods" value="2" onClick="return goods()"> <span>商品2</span></label> <label> <input type="radio" id="goods3" name="goods" value="3" onClick="return goods()"> <span>商品3</span></label> </td> </table>
ttyp03

2016/06/02 02:05

getElementByIdを使ってるのでidも同じようにgoogsに統一した方がよいですね。 以下の部分は、今回の修正でグループ化されるので、1行になります。 var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); ↓ var goods=document.getElementById("goods"); janid()は、前回選択されていたボタンと現在選択されているボタンを比較する形になると思います。 具体的なコードは考えてみてください。
ttyp03

2016/06/02 02:10

ごめんなさい。 idは統一しなくてもよさそうですので、上のgetElementByIdの部分は無視してください。 関数が呼ばれないのは、masaya_ohashiさんの回答通り、関数名が違うからです。
leoairen

2016/06/06 07:13

ご回答、ありがとうございました。 下記のように書きましたらできました。 <script> var goods1=document.getElementById("goods1"); var goods2=document.getElementById("goods2"); var goods3=document.getElementById("goods3"); function janid(){ if (goods1.checked || goods2.checked || goods3.checked){ return false; }else { alert("商品の種類を変更しました"); } } </script>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問