フォームvalidationセット

こんばんは。レターズです。
今回、フォームのvalidationセットjsを備忘録的にあげておきます。

フォームhtml

<form action="mail.php" method="post" class="wpcf7-form init contact_form" aria-label="コンタクトフォーム">
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>お名前<span class="required">※必須</span></label><input size="40" maxlength="400" class="" placeholder="レターズ" type="text" name="お名前"></p>
                        </div>
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>ふりがな<span class="required">※必須</span></label><input size="40" maxlength="400" class="" placeholder="れたーず" type="text" name="ふりがな"></p>
                        </div>
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>メールアドレス<span class="required">※必須</span></label><input size="40" maxlength="400" class="" id="your-email" placeholder="ex*****@**il.com" type="email" name="Email"></p>
                        </div>
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>メールアドレス(確認)<span class="required">※必須</span></label><input size="40" maxlength="400" class="" id="your-email-confirm" placeholder="ex*****@**il.com" type="email" name="Email(確認)"></p>
                        </div>
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>お電話番号<span class="optional">※任意</span></label><input size="40" maxlength="400" class="" placeholder="000-0000-0000" type="tel" name="電話番号"></p>
                        </div>
                        <div class="contact_form__item">
                            <p class="ff_gothic"><label>お問い合わせ内容<span class="required">※必須</span></label><textarea cols="40" rows="10" maxlength="2000" class="" placeholder="お問い合わせ内容をご入力ください" name="お問い合わせ内容"></textarea></p>
                        </div>
                        <div class="contact_form__privacy ta_center">
                            <p class="ff_gothic"><input type="checkbox" name="プライバシーポリシー[]" value="同意する" aria-label="プライバシーポリシー同意"><label><a href="https://develop-t.com/kya-reawreaw-ra/privacy/">プライバシーポリシー</a>に同意する</label></p>
                        </div>
                        <div class="ta_center">
                            <p><button type="submit" class="round_btn round_btn--blue">送信</button></p>
                        </div>
                    </form>

JavaScript

 validateForm: () => {
    console.log("validateForm");
    const formItems = document.querySelectorAll(".contact_form__item");

    // Add span for error message
    formItems.forEach(item => {
      const warning = document.createElement("span");
      warning.className = "warning-message";
      warning.style.color = "red";
      warning.style.display = "none";
      item.appendChild(warning);
    });

    const inputs = {
      name: document.querySelector("input[name='お名前']"),
      furigana: document.querySelector("input[name='ふりがな']"),
      email: document.getElementById("your-email"),
      emailConfirm: document.getElementById("your-email-confirm"),
      message: document.querySelector("textarea[name='お問い合わせ内容']"),
      phone: document.querySelector("input[name='電話番号']")
    };

    // Add input event listeners to validate fields on input
    Object.entries(inputs).forEach(([key, input]) => {
      input.addEventListener("input", () => {
        validateField(key, input);
      });
    });

    document.querySelector("form").addEventListener("submit", function (e) {
      let isValid = true;

      // Validate all fields on submit
      Object.entries(inputs).forEach(([key, input]) => {
        if (!validateField(key, input)) {
          isValid = false;
        }
      });

      if (!isValid) e.preventDefault();
    });

    function validateField(key, input) {
      const warning = input.closest(".contact_form__item").querySelector(".warning-message");
      let isValid = true;

      switch (key) {
        case 'name':
          if (input.value.trim() === "") {
            showWarning(input, "お名前を入力してください。");
            isValid = false;
          }
          break;
        case 'furigana':
          if (input.value.trim() === "") {
            showWarning(input, "ふりがなを入力してください。");
            isValid = false;
          }
          break;
        case 'email':
          if (input.value.trim() === "") {
            showWarning(input, "メールアドレスを入力してください。");
            isValid = false;
          } else if (!validateEmailFormat(input.value)) {
            showWarning(input, "メールアドレスの形式が正しくありません。");
            isValid = false;
          }
          break;
        case 'emailConfirm':
          if (input.value.trim() === "") {
            showWarning(input, "確認用メールアドレスを入力してください。");
            isValid = false;
          } else if (inputs.email.value !== input.value) {
            showWarning(input, "メールアドレスが一致しません。");
            isValid = false;
          }
          break;
        case 'message':
          if (input.value.trim() === "") {
            showWarning(input, "お問い合わせ内容を入力してください。");
            isValid = false;
          }
          break;
        case 'phone':
          if (input.value.trim() === "") {
            showWarning(input, "電話番号を入力してください。");
            isValid = false;
          } else if (!validatePhoneFormat(input.value)) {
            showWarning(input, "電話番号の形式が正しくありません。");
            isValid = false;
          }
          break;
      }

      if (isValid) {
        warning.style.display = "none";
        warning.textContent = "";
      }

      return isValid;
    }

    function showWarning(input, message) {
      const warning = input.closest(".contact_form__item").querySelector(".warning-message");
      warning.textContent = message;
      warning.style.display = "block";
    }

    function validateEmailFormat(email) {
      const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      return emailPattern.test(email);
    }

    function validatePhoneFormat(phone) {
      const phonePattern = /^(\d{10,11}|\d{2,4}-\d{2,4}-\d{4})$/;
      return phonePattern.test(phone);
    }
  }

解説

この2つを組み合わせれば、送信ボタンを押した時に未入力箇所にはエラーメッセージが表示され、さらに入力すれば瞬時にメッセージが消える、入力内容がそぐわない時(電話のフォーマットやメールのフォーマットが合わない時)はそのメッセージも出してくれます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です