実現したいこと
ラジオボタンの選択状況(組み合わせ)によって特定の画像を表示させ、各画像にリンクを追加したいです。
※4つのラジオボタンが用意されていることを前提に質問したいと思います。
※それぞれのラジオボタンを「A」「B」「1」「2」と呼ぶことにします。
※AとBのnameは「First」として、1と2のnameは「Second」です。
※ちなみに、「A」と「1」は最初から選択されているということで。
※「A」と「1」が選択されている状態では画像ファイル「A1.png」が表示されています。
次に、「A」を選択している状態でラジオボタンの「2」を選択すると画像ファイル「A2.png」が表示されます。
Bが選択されている場合も同じです。1が選択されたら~を、2が選択されたら~をという感じです。
では質問ですが、
※画像の切り替えまでのJS実装ができましたが、それぞれの画像にリンクを追加したいです。今のJSに追加した場合はソースコードの書き方を教えていただきたいです。
該当のソースコード
<!--htmlです--> <p> <label>A<input type="radio" name="First" onClick="changeImg();" checked></label> <label>B<input type="radio" name="First" onClick="changeImg();"></label> </p> <p> <label>1<input type="radio" name="Second" onClick="changeImg();" checked></label> <label>2<input type="radio" name="Second" onClick="changeImg();"></label> </p> <p><img src="A1.png" name="wear"></p> <!--ここからjsプログラムです--> function changeImg(){ var First = document.getElementsByName("ei"); var Second = document.getElementsByName("suu"); if(First[0].checked){ if(Second[0].checked){ document.wear.src = "A1.png"; }else{ document.wear.src = "A2.png"; } }else{ if(Second[1].checked){ document.wear.src = "A3.png"; }else{ document.wear.src = "A4.png"; } } }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
HTMLのタグの中に直接onClick=""
と書く方法は、現在のモダンなコーディングでは推奨されていませんので、JavaScriptコードのなかでそれぞれのラジオボタンにイベントをつけるようにしてみました。
- 動作確認用サンプル:https://jsfiddle.net/ez35dvcr/
html
1<p> 2 <label>A<input type="radio" name="First" value="A" checked></label> 3 <label>B<input type="radio" name="First" value="B"></label> 4</p> 5 6<p> 7 <label>1<input type="radio" name="Second" value="1" checked></label> 8 <label>2<input type="radio" name="Second" value="2" ></label> 9</p> 10 11<p><a href="https://example.com/A1.png" id="image-link"><img src="A1.png" id="image-result"></a></p>
javascript
1window.addEventListener('DOMContentLoaded', () => { 2 // ラジオボタンを全て取得 3 const radioBtns = document.querySelectorAll('input[type=radio]'); 4 5 // それぞれのボタンにクリックイベントをつける 6 radioBtns.forEach(btn => btn.addEventListener('click', changeImg)); 7}); 8 9// 画像とパスを変える関数(クリックイベントの内容) 10function changeImg(event) { 11 // 要素を取得 12 const firsts = document.querySelectorAll('input[name=First]'); 13 const seconds = document.querySelectorAll('input[name=Second]'); 14 const aTag = document.querySelector('#image-link'); 15 const imgTag = document.querySelector('#image-result'); 16 17 const firstVal = firsts[0].checked ? firsts[0].value : firsts[1].value; // A or B 18 const secondVal = seconds[0].checked ? seconds[0].value : seconds[1].value; // 1 or 2 19 const imgName = firstVal + secondVal; // A1 or A2 or B1 or B2 20 21 const path = { 22 A1: 'https://ant.ac.jp/', 23 A2: 'https://apple.com/services/', 24 B1: 'https://example.com/bed/', 25 B2: 'https://www.blue.co.jp' 26 }[imgName]; // オブジェクトを作って、key(imgName)で指定 27 28 // パスに反映 29 aTag.href = path; 30 imgTag.src = `../images/${imgName}.png`; 31}
連想配列から1つを選ぶ
javascript
1 const path = { 2 A1: 'https://ant.ac.jp/', 3 A2: 'https://apple.com/services/', 4 B1: 'https://example.com/bed/', 5 B2: 'https://www.blue.co.jp' 6 }[imgName];
↑この部分ちょっと意味合い的にswitch文に似ていて、
switchで書くと↓こんな感じになるんですが、行数が多すぎるので、私は↑のようにオブジェクト(連想配列)でする方が好みです。
javascript
1 let path; 2 switch (imgName) { 3 case 'A1': 4 path = 'https://ant.ac.jp/'; 5 break; 6 case 'A2': 7 path = 'https://apple.com/services/'; 8 break; 9 case 'B1': 10 path = 'https://example.com/bed/'; 11 break; 12 case 'B2': 13 path = 'https://www.blue.co.jp'; 14 break; 15 default: 16 break; 17 }
三項演算子
「?」と「:」を使った記述は、三項演算子というif文を1行で書けてしまう優れものです。
例)const firstVal = firsts[0].checked ? firsts[0].value : firsts[1].value;
javascript
1条件式 ? trueのときの処理 : falseの時の処理 2 3if (条件式) { 4 trueのときの処理 5} else { 6 falseの時の処理 7}
テンプレートリテラル
文字列はシングルクォート''
またはダブルクォート""
でかこって記述します。
しかしこの記述方法で変数を混ぜて書こうとすると、読みにくくなります。
javascript
1let name = 'たけし'; 2let greet = 'こんにちは、' + name + 'さん!'; // 'こんにちは、たけしさん!'
テンプレートリテラルという記法は、シングルやダブルクオートの代わりにバッククォート``
を使います。
この記法の利点の一つは、ドルマークと波括弧で囲うことで${変数名}
、中に変数を混ぜて書くことができることです。
コードが読みやすいですね。
javascript
1let name = 'たけし'; 2let greet = `こんにちは、${name}さん!`; // 'こんにちは、たけしさん!'
このテンプレートリテラルを利用して、画像のsrcのパスを生成しています。
javascript
1const imgName = firstVal + secondVal; 2// 'A1' or 'A2' or 'B1' or 'B2' が生成される 3 4imgTag.src = `../images/${imgName}.png`; 5// '../images/A1.png' or '../images/A2.png' or '../images/B1.png' or '../images/B2.png' が生成される
定数imgName
には、生成された文字列「A1」「A2」「B1」「B2」のいずれかが代入されています。
その定数を、テンプレートリテラルでsrcのパスとなる文字列の中に混ぜて書いています。
ですので結果的に、'../images/A1.png'
または'../images/A2.png'
または'../images/B1.png'
または'../images/B2.png'
のいずれかの文字列が生成されます。
投稿2022/10/11 09:54
編集2022/10/12 05:59総合スコア2314
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/11 10:22
2022/10/11 10:29
2022/10/11 10:30
2022/10/11 10:51
2022/10/11 11:14
2022/10/11 11:26
2022/10/11 11:48
2022/10/11 12:17
2022/10/11 12:20
2022/10/11 12:22
2022/10/11 13:46
2022/10/11 14:23
2022/10/11 20:54 編集
2022/10/12 05:01
2022/10/12 05:36
2022/10/12 09:31 編集
2022/10/12 12:25
2022/10/12 12:29
2022/10/12 12:31
2022/10/12 12:57
2022/10/12 13:00
2022/10/12 13:02
2022/10/12 13:03
2022/10/12 13:15
2022/10/12 13:24
2022/10/12 13:35
2022/10/12 13:49 編集
2022/10/12 13:59
0
htmlでimgをaタグで囲いaのhrefをjs側で変更するのが一番カンタンかと思います。
html
1<p><a id="imgPath" href="#"><img src="A1.png" name="wear"></a></p>
js
1document.wear.src = "xx.png"; 2document.getElementById("imgPath").href = "変えたいパス";
他にはimgタグにonClickを追加しそこからwindow.location.href = "path"
などでページを遷移させることも可能です
投稿2022/10/11 09:42
編集2022/10/11 10:29総合スコア759
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/11 10:23
2022/10/11 10:29
2022/10/11 10:51
2022/10/12 14:35
2022/10/13 00:37
2022/10/13 01:04
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。