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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

3回答

566閲覧

冗長なコードを簡潔にまとめたい。

vabo

総合スコア171

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2022/05/02 08:50

作成中のサイトで、ラジオボタンのクリックで画像を切り替えたいため、こちらのサイトを参考にして以下のように書きました。

html

1<div class="temp-image"> 2 <div class="temp-image-box" id="temp-image-A"> 3 <div class="temp-image-box-top"> 4 <img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84" name="lftemp1"> 5 </div> 6 7 <div class="typeA-radio colorradio"> 8 <p class="select-read-text">カラーをお選びください</p> 9 <div class="color-radio-box"> 10 <label class="radio-color-red"> 11 <input type="radio" name="lftemp1" onclick="showimgA1()" value="" class="radioreset"> 12 <span></span> 13 </label> 14 <label class="radio-color-blue"> 15 <input type="radio" name="lftemp1" onclick="showimgA2()" value="" class="radioreset"> 16 <span></span> 17 </label> 18 <label class="radio-color-green"> 19 <input type="radio" name="lftemp1" onclick="showimgA3()" value="" class="radioreset"> 20 <span></span> 21 </label> 22 <label class="radio-color-pink"><input type="radio" name="lftemp1" onclick="showimgA4()" value="ピンク" class="radioreset"> 23 <span>ピンク</span> 24 </label> 25 <label class="radio-color-orange"><input type="radio" name="lftemp1" onclick="showimgA5()" value="オレンジ" class="radioreset"> 26 <span>オレンジ</span> 27 </label> 28 </div> 29 </div> 30 </div> 31 32 <div class="temp-image-box" id="temp-image-B"> 33 <div class="temp-image-box-top"> 34 <img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84" name="lftemp2"> 35 </div> 36 37 <div class="typeB-radio colorradio"> 38 <p class="select-read-text">カラーをお選びください</p> 39 <div class="color-radio-box"> 40 <label class="radio-color-red"><input type="radio" name="lftemp2" onclick="showimgB1()" value="" class="radioreset"> 41 <span></span> 42 </label> 43 <label class="radio-color-blue"> 44 <input type="radio" name="lftemp2" onclick="showimgB2()" value="" class="radioreset"> 45 <span></span> 46 </label> 47 <label class="radio-color-green"> 48 <input type="radio" name="lftemp2" onclick="showimgB3()" value="" class="radioreset"> 49 <span></span> 50 </label> 51 <label class="radio-color-pink"> 52 <input type="radio" name="lftemp2" onclick="showimgB4()" value="ピンク" class="radioreset"> 53 <span>ピンク</span> 54 </label> 55 <label class="radio-color-orange"> 56 <input type="radio" name="lftemp2" onclick="showimgB5()" value="オレンジ" class="radioreset"> 57 <span>オレンジ</span> 58 </label> 59 </div> 60 </div> 61 </div> 62 63 <div class="temp-image-box" id="temp-image-C"> 64 <div class="temp-image-box-top"> 65 <img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84" name="lftemp3"> 66 </div> 67 68 <div class="typeC-radio colorradio"> 69 <p class="select-read-text">カラーをお選びください</p> 70 <div class="color-radio-box"> 71 <label class="radio-color-red"><input type="radio" name="lftemp3" onclick="showimgC1()" value="" class="radioreset"> 72 <span></span> 73 </label> 74 <label class="radio-color-blue"> 75 <input type="radio" name="lftemp3" onclick="showimgC2()" value="" class="radioreset"> 76 <span></span> 77 </label> 78 <label class="radio-color-green"> 79 <input type="radio" name="lftemp3" onclick="showimgC3()" value="" class="radioreset"> 80 <span></span> 81 </label> 82 <label class="radio-color-pink"> 83 <input type="radio" name="lftemp3" onclick="showimgC4()" value="ピンク" class="radioreset"> 84 <span>ピンク</span> 85 </label> 86 <label class="radio-color-orange"><input type="radio" name="lftemp3" onclick="showimgC5()" value="オレンジ" class="radioreset"> 87 <span>オレンジ</span> 88 </label> 89 </div> 90 </div> 91 </div> 92</div>

JavaScript

1//テンプレートA 2function showimgA1(){ 3 document.lftemp1.src = "https://placehold.jp/e93535/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E8%B5%A4"; 4} 5 6function showimgA2(){ 7 document.lftemp1.src = "https://placehold.jp/4644ca/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E9%9D%92"; 8} 9 10function showimgA3(){ 11 document.lftemp1.src = "https://placehold.jp/44ca6c/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E7%B7%91"; 12} 13 14function showimgA4(){ 15 document.lftemp1.src = "https://placehold.jp/ff9eb6/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E3%83%94%E3%83%B3%E3%82%AF"; 16} 17 18function showimgA5(){ 19 document.lftemp1.src = "https://placehold.jp/ffa052/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8"; 20} 21 22 23//テンプレートB 24function showimgB1(){ 25 document.lftemp2.src = "https://placehold.jp/e93535/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97B%E8%B5%A4"; 26} 27 28function showimgB2(){ 29 document.lftemp2.src = "https://placehold.jp/4644ca/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97B%E9%9D%92"; 30} 31 32function showimgB3(){ 33 document.lftemp2.src = "https://placehold.jp/44ca6c/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97B%E7%B7%91"; 34} 35 36function showimgB4(){ 37 document.lftemp2.src = "https://placehold.jp/ff9eb6/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97B%E3%83%94%E3%83%B3%E3%82%AF"; 38} 39 40function showimgB5(){ 41 document.lftemp2.src = "https://placehold.jp/ffa052/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97B%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8"; 42} 43 44//テンプレートC 45function showimgC1(){ 46 document.lftemp3.src = "https://placehold.jp/e93535/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97C%E8%B5%A4"; 47} 48 49function showimgC2(){ 50 document.lftemp3.src = "https://placehold.jp/4644ca/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97C%E9%9D%92"; 51} 52 53function showimgC3(){ 54 document.lftemp3.src = "https://placehold.jp/44ca6c/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97C%E7%B7%91"; 55} 56 57function showimgC4(){ 58 document.lftemp3.src = "https://placehold.jp/ff9eb6/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97C%E3%83%94%E3%83%B3%E3%82%AF"; 59} 60 61function showimgC5(){ 62 document.lftemp3.src = "https://placehold.jp/ffa052/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97C%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8"; 63} 64 65

codepen→ https://codepen.io/fushimi/pen/WNMNmOq

サンプルのコードでは最初の画像は1つで、選択肢も3つなので大して長くは感じませんが、今回の場合最初の時点で画像が3つ、更にそれぞれに選択肢も5つずつあるため、jsのコードが冗長で美しくないものになってしまっていると感じます。こちらをもっとコンパクトに、かつ例えば更に画像が増えた場合などのためにも汎用性が高いコードにしたいのですが、Javascriptへの理解が浅く、どのように書き換えることができるのかも分からない状態です・・・自分ならこうする、など、何かアドバイスいただけると嬉しいです。よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

javascript

1<script> 2document.addEventListener('change',e=>{ 3 const t=e.target; 4 let type; 5 if(t.matches('[type="radio"]') && (type=t.closest('[data-type]')?.dataset.type)){ 6 const img=t.closest('[data-type]').querySelector('img'); 7 const usp=new URLSearchParams(); 8 usp.append('text',type+t.dataset.text); 9 const src=`https://placehold.jp/${t.dataset.color}/ffffff/150x150.png?${usp.toString()}` 10 img.src=src; 11 } 12}); 13</script> 14<div data-type="タイプA"> 15<div> 16<img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84"> 17</div> 18<label><input type="radio" name="lftemp1" data-text="赤" data-color="e93535"></label> 19<label><input type="radio" name="lftemp1" data-text="青" data-color="4644ca"></label> 20<label><input type="radio" name="lftemp1" data-text="緑" data-color="44ca6c"></label> 21<label><input type="radio" name="lftemp1" data-text="ピンク" data-color="ff9eb6">ピンク</label> 22<label><input type="radio" name="lftemp1" data-text="オレンジ" data-color="ffa052">オレンジ</label> 23</div> 24<div data-type="タイプB"> 25<div> 26<img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84"> 27</div> 28<label><input type="radio" name="lftemp2" data-text="赤" data-color="e93535"></label> 29<label><input type="radio" name="lftemp2" data-text="青" data-color="4644ca"></label> 30<label><input type="radio" name="lftemp2" data-text="緑" data-color="44ca6c"></label> 31<label><input type="radio" name="lftemp2" data-text="ピンク" data-color="ff9eb6">ピンク</label> 32<label><input type="radio" name="lftemp2" data-text="オレンジ" data-color="ffa052">オレンジ</label> 33</div> 34<div data-type="タイプC"> 35<div> 36<img src="https://placehold.jp/bfbfbf/ffffff/150x150.png?text=%E3%82%AB%E3%83%A9%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84"> 37</div> 38<label><input type="radio" name="lftemp3" data-text="赤" data-color="e93535"></label> 39<label><input type="radio" name="lftemp3" data-text="青" data-color="4644ca"></label> 40<label><input type="radio" name="lftemp3" data-text="緑" data-color="44ca6c"></label> 41<label><input type="radio" name="lftemp3" data-text="ピンク" data-color="ff9eb6">ピンク</label> 42<label><input type="radio" name="lftemp3" data-text="オレンジ" data-color="ffa052">オレンジ</label> 43</div> 44

投稿2022/05/02 09:18

編集2022/05/02 09:19
yambejp

総合スコア114806

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

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

vabo

2022/05/09 04:53 編集

確認が遅くなってしまい申し訳ございません。 data属性でsrcも書き換えられるの、すごくいいですね・・・!コードもとても短くスマートになりましたし、もし更に選択肢を追加したい時もhtmlを書き足すだけで良いのは非常に助かります。こういう風にできたらな・・・とぼんやり考えていたことが実現できるコードで、大変勉強になりました。ありがとうございました!
guest

0

  • <input type=radio> に、対応する画像URLを data-image 属性として足す。
  • <input type=radio>onclick 属性と呼んでいる関数をすべて消す。
  • 以下のようなコードを足す

js

1document.addEventListener('change', e => { 2 if (e.target.matches('*[name][data-image]')) { 3 document[e.target.name].src = e.target.dataset.image; 4 } 5});

投稿2022/05/02 09:10

int32_t

総合スコア20850

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

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

vabo

2022/05/09 04:57

確認が遅くなってしまい申し訳ございません。 data属性を使うことでこんなに短くスマートなコードで実装できるのですね。追加・編集する際も、htmlの書き換えだけで済むのはとても助かります。大変勉強になるご回答をありがとうございました・・・!
guest

0

function showimg関数を画像の数だけ作るのではなく、関数に渡す引数で処理を分岐させるのはどうでしょうか?
function showing(id) {
if (id === 1) {
document.lftemp1.src = "https://placehold.jp/e93535/ffffff/150x150.png?text=%E3%82%BF%E3%82%A4%E3%83%97A%E8%B5%A4";
}
}

これならABCそれぞれのグループを関数で分けることができ、その中でどれがクリックされたかで表示する画像を判別することもできます

投稿2022/05/02 09:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

vabo

2022/05/09 05:02

確認が遅くなってしまい申し訳ございません。 それぞれのグループを関数で分けることができると、それだけでとても見やすく、何度も関数を書いていた以前のコードよりも格段にわかりやすくなりました。引数での条件分岐について、もっと勉強したいと思います。大変参考になるご回答をありがとうございました・・・!
退会済みユーザー

退会済みユーザー

2022/05/09 05:31

他の皆様のコードが分かりやすく自分も勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問