ログイン中の画面で、登録済みのメールアドレスを変更できる機能を作成しました。
こんにちは。Webコーダーのはるです。
現在、所属している「もりけん塾」でJavaScriptのハンズオン課題 に取り組み、レビューをいただいています。
今日は、課題29 についてアウトプットをしていきます。
(前回までのアウトプットは、こちらです。)
実装する過程で学んだことを、学習ノートとして記録していきます。
認識の間違えている箇所がありましたら、お問い合わせからご指摘いただけるとうれしいです。
JavaScript課題29の仕様
(もりけんさんのJavaScriptハンズオン課題より)
JavaScript課題29の学習記録
主にレビューいただいた箇所の復習として記録を残します。
HTML
メールアドレス変更ページのform部分です。
// 新規メールアドレス入力input
<div class="form__item">
<label for="email">新規E-mailアドレス入力<span class="form__required">必須</span></label>
<input type="email" class="form__item-input js-form-email" id="email" name="email" autocomplete="off" aria-describedby="email-constraints" tabindex="1" required>
<p class="error" id="email-constraints"></p>
</div>
—
<input type="email" aria-describedby="password-constraints">
<p id="password-constraints"></p> // エラー文表示部分
バリデーション
以下の3つのinput要素を配列に入れます。
① 新規メールアドレス
② 確認用新規メールアドレス
③ 登録済みパスワード
const emailOfInput = document.querySelector(".js-form-email");
const confirmEmailOfInput = document.querySelector(".js-form-confirm-email");
const passwordOfInput = document.querySelector(".js-form-password");
const formElements = [emailOfInput, confirmEmailOfInput, passwordOfInput];
配列formElements
に対して、forEachでそれぞれの要素にバリデーションを行います。このように書きました。
formElements.forEach(element => {
element.classList.add("invalid");
element.addEventListener("blur", (e) => {
if(e.relatedTarget === eyeIcon) {
if(passwordOfInput.value && errorOfPassword.textContent === "入力してください") errorOfPassword.textContent = "";
return;
}
checkFormValidityInBlur(submitButton, element);
if(emailOfInput.value && confirmEmailOfInput.value) errorOfConfirmEmail.textContent = isMatchValue(emailOfInput, confirmEmailOfInput) ? "" : "上記のE-mailアドレスと異なります。もう一度入力してください。";
if(hasInvalidClass()) return;
confirmIfCanSubmit();
});
});
レビューコメントを記録しながら、分解します。
① 全てにinvalidクラスを付与します。
※空欄チェック/形式チェックが通ると、invalidクラスが外れます。
formElements.forEach(element => {
element.classList.add("invalid");
② elementがblurされたらバリデーションを空欄チェック・形式チェックを走らせる。
※ if(e.relatedTarget === eyeIcon) {・・・ は後ほどパスワード表示/非表示機能の部分で説明します。
checkFormValidityInBlur(submitButton, element);
このコードは、modulesで切り出したvalidationコードをimportしています。
今までも何度も記録で出てきているので割愛します。
③ 新メールアドレス、確認用新メールアドレスが入力されていたら、値がマッチしているか調べる。
if(emailOfInput.value && confirmEmailOfInput.value) errorOfConfirmEmail.textContent = isMatchValue(emailOfInput, confirmEmailOfInput) ? "" : "上記のE-mailアドレスと異なります。もう一度入力してください。";
④ invalidクラスがないか確認
if(hasInvalidClass()) return;
⑤ バリデーションがOKであれば、submitボタンのdisabledを解除する。
confirmIfCanSubmit();
const confirmIfCanSubmit = () => submitButton.disabled = !isMatchValue(emailOfInput, confirmEmailOfInput);
パスワードの表示/非表示機能
目のアイコンを押すと、パスワードの表示・非表示を切り替えられるようにしました。
① 先程のバリデーションのコード内で、以下を実行。
element.addEventListener("blur", (e) => {
if(e.relatedTarget === eyeIcon) {
if(passwordOfInput.value && errorOfPassword.textContent === "入力してください") errorOfPassword.textContent = "";
return;
}
e.relatedTargetで、elementがblurした先の要素を取得することができます。
e.relatedTarget === eyeIconの時は、バリデーションをreturnするようにしました。
また、パスワードが入力されており、すでに「入力してください」エラーが出ているときは、そのエラーのみ消去するようにしました。
② 目のアイコンをblurした時の挙動も実装しました。
eyeIcon.addEventListener("blur", (e) => {
if(e.relatedTarget === passwordOfInput) return;
checkFormValidityInBlur(submitButton, passwordOfInput);
if(hasInvalidClass()) return;
confirmIfCanSubmit();
});
– e.relatedTargetがパスワードのinput内の時は、バリデーションは走らない
—
送信ボタンのクリックイベント
【クリックイベントでやりたいこと】
- ログイン時に発行されるtokenが存在するか確認(URLの直叩き防止)
- 登録済みのパスワードと入力値が一致するか確認
- 一致 -> メールアドレス変更
- 不一致 -> エラーを出す
- URLパラメータにtokenを付与して、登録完了ページへ遷移
このように書きました。
※ 学習のため、ローカルストレージを使用しています。適さないことを理解しています。
submitButton.addEventListener("click", () => {
const token = localStorage.getItem("token");
const registeredData = JSON.parse(localStorage.getItem("registeredData"));
if(!token) {
window.location.href = "./notautherize.html";
return;
}
if(!registeredData) {
localStorage.removeItem("token");
window.location.href = "./notautherize.html";
return;
}
if(!isMatchPassword(registeredData)){
document.querySelector('[data-name="current-password-error"]').textContent = "パスワードが一致しません";
submitButton.disabled = true;
return;
}
changeAndSetEmail(registeredData);
const urlParameter = `?token=${token}`;
window.location.href = `./reset-email-done.html${urlParameter}`;
});
if(!token) {
window.location.href = "./notautherize.html";
return;
}
if(!registeredData) {
localStorage.removeItem("token");
window.location.href = "./notautherize.html";
return;
}
今回のコード
Sign Upから会員登録 -> ログインをして、管理画面 -> メールアドレス変更に遷移することで実際に挙動を確認することができます。
//
学習に使用している本は、JavaScript本格入門・独習JavaScriptです。
あとがき
もりけんさん(@terrace_tec)、さえさん(@sae_prog)、まいさん(@mai2022web)、ちひろさん(@chihiro7029) お忙しい中レビューいただきありがとうございました!
今回も、細かな動作確認から、関数の切り出し方や命名、フォームのアクセシビリティなど様々なレビューをいただき、より良いコードにRefactorすることができました。
教えていただいたことを生かして、次の課題に進みたいと思います!
今日は以上です。
//
【もりけん塾で勉強しています】
もりけんさん(@terrace_tec)のHPはこちら
新規E-mailアドレス入力のinputには、オートコンプリート機能がない方が使いやすいと教えていただきました。<input>に autocomplete=”off”をつけました。