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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

375閲覧

Javascriptでフォームの表示・非表示を切り替えたい

sc2273

総合スコア12

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/11/26 04:20

前提・実現したいこと

20分調べてどうにも分からなかったため、初めて質問させていただきます。
諸先輩方、何卒よろしくお願いいたします。

アンケートフォームを作成しており、フォームの選択肢によって表示・非表示を動的に切り替えたいと考えております。

Q1-1.本サービスを利用する1番目の理由に該当するものを選択してください ○ 価格 ○ 品質 ○ サポート体制 ○ 知名度 ○ ブランド ○ その他 Q1-2.本サービスを利用する2番目の理由に該当するものを選択してください ○ 価格 ○ 品質 ○ サポート体制 ○ 知名度 ○ ブランド ○ その他 Q1-3.本サービスを利用する3番目の理由に該当するものを選択してください ○ 価格 ○ 品質 ○ サポート体制 ○ 知名度 ○ ブランド ○ その他

例えばQ1-1.で「知名度」を選択した場合、自動的にQ1-2,Q1-3からは知名度が選択肢から消えるようにしたいです。
要するにQ1-3に回答する際、選択肢が2つ消えた状態になっている必要がございます。

このフォームは作成できたのですが、選択肢によってフォームの表示・非表示の切り替えがどうすれば実現できるのか分かりませんでした。

発生している問題・エラーメッセージ

問題といたしましてはQ.1-1とQ.1-2とQ.1-3が同じ回答を持つということです。
ここに関してどうすれば別フォームの値を選択肢から削除できるのかが分かりませんでした。

該当のソースコード

念のため、下記にソースコードを記述いたします。

HTML

1<form method="post" id="form" action="confirm.php"> 2 <h2 class="title">Q1-1.本サービスを利用する1番目の理由に該当するものを選択してください</h2> 3 <div class="question_content"> 4 <input type="radio" name="q1-1" value="価格"> 5 <input type="radio" name="q1-1" value="品質"> 6 <input type="radio" name="q1-1" value="サポート体制"> 7 <input type="radio" name="q1-1" value="知名度"> 8 <input type="radio" name="q1-1" value="ブランド"> 9 <input type="radio" name="q1-1" value="その他"> 10 </div><!-- #Q1-1 --> 11 <h2 class="title">Q1-2.本サービスを利用する2番目の理由に該当するものを選択してください</h2> 12 <div class="question_content"> 13 <input type="radio" name="q1-2" value="価格"> 14 <input type="radio" name="q1-2" value="品質"> 15 <input type="radio" name="q1-2" value="サポート体制"> 16 <input type="radio" name="q1-2" value="知名度"> 17 <input type="radio" name="q1-2" value="ブランド"> 18 <input type="radio" name="q1-2" value="その他"> 19 </div><!-- #Q1-2 --> 20 <h2 class="title">Q1-3.本サービスを利用する3番目の理由に該当するものを選択してください</h2> 21 <div class="question_content"> 22 <input type="radio" name="q1-3" value="価格"> 23 <input type="radio" name="q1-3" value="品質"> 24 <input type="radio" name="q1-3" value="サポート体制"> 25 <input type="radio" name="q1-3" value="知名度"> 26 <input type="radio" name="q1-3" value="ブランド"> 27 <input type="radio" name="q1-3" value="その他"> 28 </div><!-- #Q1-3 --> 29 <h2 class="title">その他を選択された方のみご入力ください</h2> 30 <div class="question_content"> 31 その他理由:<input type="text" name="other" size="20" value="" maxlength="255"> 32 </div><!-- #other --> 33 <h2 class="title">Q2.ご意見・ご感想など</h2> 34 <div class="wrap"> 35 <textarea name="q2" cols="30" rows="20"></textarea> 36 </div><!-- #Q2 --> 37 <p class="submit_button" align="center"> 38 <input type="submit" value="  確認画面へすすむ  " /> 39 </p> 40</form>

試したこと

「フォーム 値 表示 非表示」で検索し、いくつかの記事を読みましたが、直接的な解決方法を発見することができませんでした。
発見できた記事は一つのラジオボタンの値によって、要素の表示・非表示を切り替えるのみでした。

補足情報(FW/ツールのバージョンなど)

DreamWeaver CS6を使用しております。

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

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

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

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

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

guest

回答2

0

Javascriptでフォームの表示・非表示を切り替えたい

JavaScriptに直接フォームの表示・非表示を切り替える機能はありません。
HTMLファイルをブラウザが読み取って構築したDOMツリーというものがあり、
それに対してJavaScriptが変更を促す事で、DOMツリーを変更して見た目を変化させることだけです。

そして表示・非表示を切り替える為にはこれらの方法があります。

  • 【推奨】予めスタイルシートに.hidden { display: none; }等と書いておき、JavaScriptで不要なフォーム部品にhiddenクラスを付与して見た目だけを非表示にする
  • 【非推奨】フォーム部品をJavaScriptの変数として所持しておき、選択肢に応じてフォーム部品をDOMツリーに挿し込む
  • 【高難易度】Vue.js等のJSフレームワークを利用して、テンプレート上でv-if等を使って制御する

DOMツリーをJavaScriptでゴリゴリ編集するのは、
バリバリのフロントエンドエンジニアでもデバッグで死ぬのでやめたほうが良いです。
あくまでDOMツリー構造では全てを描画する設定にしてしまって、
クラスの付け外しで表示/非表示を切り替えるだけにしておくようにしましょう。

質問文のように、口頭で説明すればシンプルだけど
複雑な仕様になってくるとVue.jsなどのJSフレームワークがあればかなり便利ですね。
検討してみてください。

問題といたしましてはQ.1-1とQ.1-2とQ.1-3が同じ回答を持つということです。

もし我々がプロの仕事としてお受けする場合、
イレギュラーケースの対応等も込みだと仕様が複雑になってしまうので、
ネイティブのJSで全部やれという話なら数日仕事になるので数万のお仕事になります。
頑張って書いてみてください。

jQueryならname="q1-1"のフォーム部品が選択された事をトリガーに関数を実行出来ますので、
その関数内で2番目と3番目の選択肢の内、不要な選択肢を非表示にするという事を記述してみてください。

HTMLのクラスは半角スペースで複数指定する事が可能ですので、
それで2つ目、3つ目の質問という風に別のものだよという風に差別化してあげましょう。
更に「価格」「ブランド」「その他」などの選択肢もJavaScriptでDOMツリーとしてつかみやすくする為にクラス名を割り振って上げると楽だと思います。

投稿2018/11/26 04:55

miyabi-sun

総合スコア21158

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

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

sc2273

2018/11/26 11:37

>miyabi-sun様 とても詳しい内容でのご回答ありがとうございます!! 初めに謝らないといけないのですが、”Javascriptでフォームの表示・非表示を切り替えたい”と書いたのは、 私がJavascriptでないと切り替えられないと思い込んでいたからです。 もし、Javascriptにこだわりがあるように伝わってしまっていたら申し訳ありません・・。 DOMツリー自体初めて知りまして、miyabi-sun様にご教示いただいた通り、これでフォームを制御するのは今の私には無理難題だと感じました。 そのためJavascriptであれば推奨していただいた、display: none;での実装か、jQueryでの実装を試行錯誤しながら考えてみます!
guest

0

ベストアンサー

こんな感じです

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 [].forEach.call(document.querySelectorAll('.question_content input[type=radio]'),function(x){ 4 x.addEventListener('change',function(e){ 5 [].forEach.call(document.querySelectorAll('.question_content label'),function(y){ 6 y.style.display=''; 7 }); 8 [].forEach.call(document.querySelectorAll('.question_content input[type=radio]:checked'),function(y){ 9 [].forEach.call(document.querySelectorAll('.question_content input[type=radio][value='+y.value+']:not([name='+y.name+'])'),function(y){ 10 y.closest('label').style.display='none'; 11 }); 12 }); 13 }); 14 }); 15}); 16</script> 17<form> 18 <h2 class="title">Q1-1.本サービスを利用する1番目の理由に該当するものを選択してください</h2> 19 <div class="question_content"> 20 <label><input type="radio" name="q1-1" value="価格">価格</label> 21 <label><input type="radio" name="q1-1" value="品質">品質</label> 22 <label><input type="radio" name="q1-1" value="サポート体制">サポート体制</label> 23 <label><input type="radio" name="q1-1" value="知名度">知名度</label> 24 <label><input type="radio" name="q1-1" value="ブランド">ブランド</label> 25 <label><input type="radio" name="q1-1" value="その他">その他</label> 26 </div><!-- #Q1-1 --> 27 <h2 class="title">Q1-2.本サービスを利用する2番目の理由に該当するものを選択してください</h2> 28 <div class="question_content"> 29 <label><input type="radio" name="q1-2" value="価格">価格</label> 30 <label><input type="radio" name="q1-2" value="品質">品質</label> 31 <label><input type="radio" name="q1-2" value="サポート体制">サポート体制</label> 32 <label><input type="radio" name="q1-2" value="知名度">知名度</label> 33 <label><input type="radio" name="q1-2" value="ブランド">ブランド</label> 34 <label><input type="radio" name="q1-2" value="その他">その他</label> 35 </div><!-- #Q1-2 --> 36 <h2 class="title">Q1-3.本サービスを利用する3番目の理由に該当するものを選択してください</h2> 37 <div class="question_content"> 38 <label><input type="radio" name="q1-3" value="価格">価格</label> 39 <label><input type="radio" name="q1-3" value="品質">品質</label> 40 <label><input type="radio" name="q1-3" value="サポート体制">サポート体制</label> 41 <label><input type="radio" name="q1-3" value="知名度">知名度</label> 42 <label><input type="radio" name="q1-3" value="ブランド">ブランド</label> 43 <label><input type="radio" name="q1-3" value="その他">その他</label> 44 </div><!-- #Q1-3 --> 45</form>

ただしclosestは未対応のブラウザがあるので、汎用的にするには一工夫必要

投稿2018/11/26 04:50

yambejp

総合スコア114829

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

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

sc2273

2018/11/26 11:53

>yambejp様 ご回答ありがとうございます! いただいたコードで試してみたところ、探していた通りの挙動が実現できました。 Javascriptだけでは自分の力では全く解決策が見つからなかったのでとても助かりました。 本当にありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問