🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

JavaScript

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

Q&A

解決済

3回答

1480閲覧

javascriptの簡単なコードなのですが、非効率になってしまうのを効率的にしたいです。

hirokuro900

総合スコア33

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

JavaScript

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

0グッド

0クリップ

投稿2019/12/20 15:40

現在練習用のサイトを作成しておりまして、javascriptを使っているのですが非効率的で困っています。もっと効率良くかけるのではないかと考えているのですが、ちゃんと動くコードにするだけでとても時間がかかってしまいました。

実現したい事はラジオボタンでAタイプを選択した状態の場合、セレクトボックスの結果を<p id="a_type">に出力してラジオボタンでBタイプを選択した場合セレクトボックスの結果を<p id="b_type">に出力するとゆうことです。

HTML

1<!--ここでTYPEを選択します--> 2<form name="form1" action=""> 3 <input type="radio" id="radio1" name="page" required checked onchange="selected_page();">A-TYPE 4 <input type="radio" id="radio2" name="page" onchange="selected_page();">B-TYPE 5</form> 6 7<!--上記のTYPEに表示したい項目を選択します--> 8<form name="form2" action=""> 9 <select id="Select1" onchange="selected_page();"> 10 <option>0ページ</option> 11 <option>1ページ</option> 12 <option>2ページ</option> 13 <option>3ページ</option> 14 <option>4ページ</option> 15 </select> 16</form> 17 18<!--ここに結果を表示させます--> 19<p id="a_type">0ページ</p> 20<p id="b_type">0ページ</p>

CSS

1#b_type { 2 display: none; 3}

javascript

1function selected_page() { 2 let check1 = document.getElementById("radio1").checked; 3 let check2 = document.getElementById("radio2").checked; 4 5 if (check1 == true) { 6 let sel = "a_type"; 7 let target = document.getElementById(sel); 8 target.style.display = "block" 9 document.getElementById("b_type").style.display = "none" 10 let selindex = document.getElementById("Select1").selectedIndex; 11 switch (selindex) { 12 default: 13 target.innerHTML = "0ページ"; 14 break; 15 case 1: 16 target.innerHTML = "1ページ"; 17 break; 18 case 2: 19 target.innerHTML = "2ページ"; 20 break; 21 case 3: 22 target.innerHTML = "3ページ"; 23 break; 24 case 4: 25 target.innerHTML = "4ページ"; 26 break; 27 } 28 } 29 else if (check2 == true) { 30 let sel = "b_type"; 31 let target = document.getElementById(sel); 32 target.style.display = "block" 33 document.getElementById("a_type").style.display = "none" 34 let selindex = document.getElementById("Select1").selectedIndex; 35 switch (selindex) { 36 default: 37 target.innerHTML = "0ページ"; 38 break; 39 case 1: 40 target.innerHTML = "1ページ"; 41 break; 42 case 2: 43 target.innerHTML = "2ページ"; 44 break; 45 case 3: 46 target.innerHTML = "3ページ"; 47 break; 48 case 4: 49 target.innerHTML = "4ページ"; 50 break; 51 } 52 } 53}

javascriptですが、内容が同じswitch文を二回使ってしまっていたり色々と問題がある気がしています..

お詳しい方だったらどのような感じにするのか教えていただけないでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

<select></select>要素から現在の値を得るのに、.selectedIndexを介しswitchする必要はありません。.valueで直接取れます。
そのため元コードの以下の部分は…

JavaScript

1 let selindex = document.getElementById("Select1").selectedIndex; 2 switch (selindex) { 3 default: 4 target.innerHTML = "0ページ"; 5 break; 6 case 1: 7 target.innerHTML = "1ページ"; 8 break; 9 case 2: 10 target.innerHTML = "2ページ"; 11 break; 12 case 3: 13 target.innerHTML = "3ページ"; 14 break; 15 case 4: 16 target.innerHTML = "4ページ"; 17 break; 18 }

以下のコードに置き換えられます。

JavaScript

1 let page = document.getElementById("Select1").value; 2 target.innerHTML = page;

次に、チェックされてたラジオボタンを得るために両者のチェック状態を取得しif文で判定してらっしゃいますが、querySelectorを使って以下のように書くと簡単に現在チェックされている要素を取れます。

JavaScript

1 let checked = document.querySelector('[name=page]:checked');

ここまででswitchifを消して共通化でき、大幅にコードが短くなると思いますが、好みもあるでしょうがあと二点。
一つは選択されたradioボタンに対応する表示p要素のidを、jsコード中のハードコードから、html側でdata属性(名前はdata-targetにしました)で指定するようにしました。

HTML

1 <input type="radio" id="radio1" name="page" required checked onchange="selected_page();" data-target="a_type"> 2A-TYPE 3 <input type="radio" id="radio2" name="page" required onchange="selected_page();" data-target="b_type">B-TYPE

JavaScriptからは、以下のように取り出し・使用します。

JavaScript

1 let checked = document.querySelector('[name=page]:checked'); 2 let targetId = checked.dataset.target; 3 let target = document.getElementById(targetId);

二点目は、2つの表示用<p></p>要素の表示非表示の切り替えを.style.displayへの値の代入で行ってらっしゃいますが、これをdisplay: none;だけ記述した非表示CSSクラス(名前はhideなど)を用意して、CSSクラスの付け外しで行うようにしました。2要素なので自己満足なのですが、要素が多くなってもjsコードが複雑化しにくいです。
以下のような感じです。

CSS

1.hide { 2 display: none; 3}

HTML

1<p id="a_type">0ページ</p> 2<p id="b_type" class="hide">0ページ</p>

JavaScript

1 let target = document.getElementById(targetId); 2 document.querySelectorAll('#a_type,#b_type').forEach(elm => { 3 elm.classList.add('hide'); 4 }); 5 target.classList.remove('hide');

考え方としては、(非表示用クラス.hideを付けることで)一旦すべて隠し、ターゲットのみ外す、という2ステップになります。(#a_type,#b_typeと要素を個別に列挙していますが、あとで要素が増えるとjsコードに追加の修正が要るため、本当は共通クラスをつけるなり、divでラップするなりして、一括指定したほうがいいです)

動作確認コードはこちらになります。

投稿2019/12/20 18:54

shinji709

総合スコア805

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

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

hirokuro900

2019/12/22 03:38

貴重なご意見ありがとうございます!とても参考になりましたm(_ _)m 思っていたよりも大分短くできて初めてみるコードも沢山あり勉強になりました! ありがとうございましたm(_ _)m
guest

0

こんにちは

一例として、以下のようにするかなと思います。

まずHTMLのほうで、各ラジオボタンに value 属性を追加して、その値を a_type および b_type にします。

html

1<input type="radio" id="radio1" name="page" value="a_type" required checked onchange="selected_page();">A-TYPE 2<input type="radio" id="radio2" name="page" value="b_type" onchange="selected_page();">B-TYPE

その上で、 関数 selected_page() を以下のように修正します。

javascript

1function selected_page() { 2 const targetId = document.forms[0].page.value; 3 const target = document.getElementById(targetId); 4 const selindex = document.getElementById("Select1").selectedIndex; 5 target.style.display = "block"; 6 target.innerHTML = `${selindex}ページ`; 7 8 const otherId = `${targetId === 'a_type' ? 'b' : 'a'}_type`; 9 document.getElementById(otherId).style.display = "none"; 10}

参考になれば幸いです。

追記

shinji709さんのご回答で指摘されているように

javascript

1const selindex = document.getElementById("Select1").selectedIndex; 2 3target.innerHTML = `${selindex}ページ`;

の部分は、以下の一行で済みます。

javascript

1target.innerHTML = document.getElementById("Select1").value;

上記のように、代入される右辺がHTMLではない文字列である場合は、 target のtextContent プロパティに代入するように

javascript

1target.textContent = document.getElementById("Select1").value;

としてもよいです。

投稿2019/12/20 16:41

編集2019/12/20 23:40
jun68ykt

総合スコア9058

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

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

0

同じswitch文を二回使ってしまっていたり、色々と問題がある気がしています

問題に感じているのは、「読み返すと、長くて読みにくい。」では?

同じような処理は、

  1. 関数化できないかを考えます。
  2. 関数の入力、出力 の値を見直します。

例えば、関連する 要素の id 属性を与える方法だと次のようにできそうです。

javascript

1const formatPage = pagenum => (pagenum<5 ? pagenum : 0) + "ページ"; 2 3const getPageName = (showId, hideId, selectedId) => { 4 let target = document.getElementById( showId ); 5 target.style.display = "block" 6 document.getElementById( hideId ).style.display = "none"; 7 8 let selindex = document.getElementById( selectedId ).selectedIndex; 9 target.innerHTML = formatPage(selindex); 10 11}

投稿2019/12/20 16:24

AkitoshiManabe

総合スコア5434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問