Express.jsで二択の質問にユーザーが回答し集計結果を表示させるアプリを作成しています。質問に回答する際に、ユーザー情報に年齢と性別が含まれている場合にはそのまま回答内容をフォーム送信し、含まれていない場合にはモーダル画面で年齢と性別を設定させた後に回答内容をフォーム送信したいです。
分岐をかけてモーダルを表示させて年齢と性別をユーザー情報に保存することはできたのですが、年齢性別情報の保存後、あるいはすでに年齢と性別が設定されていた場合に、元の回答内容のフォームを送信を行う処理をどのように書けばよいのか分かりませんでした。
hbs
1{{!-- 回答内容の送信フォーム--!}} 2<form id="answer-question" method="post"> 3 <button type="submit" class="btn btn-outline-secondary btn-choice" name="countA" value="1"> 4 [A] {{targetQuestion.ansA}} 5 </button> 6 <button type="submit" class="btn btn-outline-secondary btn-choice" name="countB" value="1"> 7 [B] {{targetQuestion.ansB}} 8 </button> 9</form> 10 11{{!-- Modal --}} 12<div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true"> 13 <div class="modal-dialog modal-dialog-centered" role="document"> 14 <div class="modal-content"> 15 <div class="modal-header"> 16 <h5 class="modal-title" id="exampleModalCenterTitle">年齢と性別を選択して下さい。</h5> 17 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 18 <span aria-hidden="true">×</span> 19 </button> 20 </div> 21 <div class="modal-body"> 22 <input type="radio" name="gender" value="male" class="modal-gender-inp"> 23 <label for="inq1">男性</label> 24 <input type="radio" name="gender" value="famale" class="modal-gender-inp"> 25 <label for="inq2">女性</label><br> 26 <label>年齢</label> 27 <select name="age" id="modal-age-inp"></select> 28 </div> 29 <div class="modal-footer"> 30 <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> 31 <button type="button" class="btn btn-primary" id="modal-submit">Save changes</button> 32 </div> 33 </div> 34 </div> 35</div>
JavaScripts
1const answerButton = document.querySelector('.btn-choice'); 2const modalSubmitButton = document.getElementById('modal-submit'); 3const modalGenderInp = document.querySelectorAll('.modal-gender-inp'); 4const modalAgeInp = document.getElementById('modal-age-inp'); 5 6answerButton.addEventListener('click', () => { 7 fetch('/users/self.json').then((response) => { 8 response.json().then((result) => { 9 const { user } = result; 10 if (user.age && user.gender) { 11 // 年齢と性別が設定されていた場合回答内容をフォーム送信する 12 } 13 $(document.getElementById('exampleModalCenter')).modal(); 14 }); 15 }); 16}); 17 18modalSubmitButton.addEventListener('click', () => { 19 const [chekedGenderInp] = [...modalGenderInp].filter((e) => e.checked); 20 fetch('/users/self', { 21 method: 'PATCH', 22 headers: { 23 'Content-Type': 'application/json', 24 }, 25 body: JSON.stringify({ age: modalAgeInp.value, gender: chekedGenderInp.value }), 26 }).then(() => { 27 // 年齢と性別をユーザー情報に保存した後、回答内容をフォーム送信する 28 }); 29}); 30
なお、回答内容のフォーム送信先URLはクエリを含むためJavaScriptで以下のように動的に変更しています。
JavaScript
1const answerQuestion = document.getElementById('answer-question'); 2const _questionId = window.location.href.split('/questions/')[1].split('?')[0]; 3answerQuestion.setAttribute('action', `/questions/${_questionId}${categoryKeywordParams}`);
そもそもモーダルを挟んで元のフォーム処理を行うことが可能であるかどうかよく分かっていないのですが、もし可能であればアドバイスを頂けると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。