#行たいこと
生年月日を入力するフォームを作っているのですが、生年に対して下記の条件に合致しているかのバリデーションを行いたいと思っています。
①未入力ではない
②半角数字4桁での入力
③1951年〜2010年の間
それぞれ①→②→③の順に検証し、引っかかった場合にはエラーメッセージを出す、ということを行おうと思っています。
自分自身で下記の内容を参考に、①→②の部分は実装ができたのですが、③の部分で詰まっています。
参考にしたページ:https://qiita.com/ezawa800/items/6628890bb343cd6bbc14#%E6%96%87%E5%AD%97%E6%95%B0%E5%88%B6%E9%99%90
#ソースコードと現状把握している挙動
html
1<h2>生年月日</h2> 2 <div class="form-item birth"> 3 <input type="tel" maxlength="4" name="year" id="year" pattern="\d{4}" required> 4 <p>年</p> 5 <input type="tel" maxlength="2" name="month" id="month" pattern="\d{1,}" required> 6 <p>月</p> 7 <input type="tel" maxlength="2" name="day" id="day" pattern="\d{1,}" required> 8 <p>日</p> 9 </div> 10 <div id="birth_error"></div>
JavaScript
1//year 2document.addEventListener("DOMContentLoaded", function(evt) { 3 document.querySelector('#year').addEventListener('input', function(event) { 4 var yearInput = event.target, 5 yearErrorBox = document.querySelector('#birth_error'); 6 if (yearInput.checkValidity()) { 7 yearErrorBox.innerHTML = ''; 8 return; 9 } 10 var regex = new RegExp(yearInput.getAttribute('pattern')); 11 if (yearInput.value === "") { 12 yearErrorBox.innerHTML = '生まれた年の入力は必須です。'; 13 } else if (!regex.test(yearInput.value)) { 14 yearErrorBox.innerHTML = '生まれた年は4文字の半角数字で入力してください。'; 15 } else if (Number(yearInput.value) < 1951 || 2010 < Number(yearInput.value)) { 16 yearErrorBox.innerHTML = '生まれた年は1951年〜2010年の間で入力してください'; 17 } 18 }); 19});
console.log(yearInput.value);で確認をしたところ、console.logを//yearの1行下に入れた場合は半角数字4桁を入力しても
コンソールにその文字列が出力されているのですが、var regex = new RegExp(yearInput.getAttribute('pattern'));の1行下に入れた場合、
半角数字4桁を入力した場合consoleには出力されない(半角数字3桁未満や英字・全角文字などは表示される)といった挙動でした。
おそらくhtmlのinput#yearのpatternが何か原因なのか、と思い、pattern='\d'に書き直した({4}を取った)ところ、無事エラーメッセージが表示されました。
ただこれでは条件②の4文字で入力、の部分が判定できなくなってしまうため、他の方法を探りたいと思い質問させていただきました。
伝わりづらいところなどもあると思いますが、お知恵お借りできますと幸いです・・・!
#質問者のレベル
html,css,js,python,Cの学習歴3ヶ月
回答3件
あなたの回答
tips
プレビュー