Задать вопрос
@deantek

Как сделать валидацию нескольких форм на одной странице в реальном времени?

Пытаюсь сделать валидацию нескольких форм на одной странице и валидация срабатывает только при клике на кнопку отправить.

что я сделал:
1) создал объект Valid, куда добавил функции для валидации разных полей: checkbox, phone, name и тд(полей может быть много)
2) при клике на отправить я достаю id формы и передаю аргументом в функции объекта Valid.name(this.id), а в функциях объекта просто меняю классы и проверяю регулярным выражением
3) валидация срабатывает, но не в реальном времени, но если не передавать аргументы в Valid.name() и другие поля, то валидация происходит в реальном времени, но срабатывает на всех формах

вот демо - https://codesandbox.io/s/stupefied-bohr-6oqx6?file...

подскажите, что нужно делать, чтобы валидировать несколько форм на странице в реалтайме, в гугле ответа не нашел, там только валидация для одной формы

$(() => {
  let Valid = {
    name: function (formId) {
      let userNameMsg = $(formId).find("div[id*='valid_userName']");
      // если не передавать formId, а просто прописать ("from div[id*='valid_userName']") 
      // то валидация сработает в реалтайме, но на всех формах
      let elem = $(formId).find("input[name='userName']");
      // eslint-disable-next-line
      const reg = /(^[A-Za-z]{1}[a-z]{1,14}( [A-Za-z]{1})?([a-z]{1,14})?$)|(^[А-Яа-я]{1}[а-я]{1,14}( [А-Яа-я]{0,1})?([а-я]{0,15})?$)/;
      if (!reg.test(elem.val())) {
        Valid.errors = true;
        userNameMsg.addClass("valid_error").html("← минимум 2 буквы").show();
        elem.removeClass("valid_normal").addClass("valid_wrong");
      } else {
        userNameMsg.removeClass("valid_error").hide();
        elem.removeClass("valid_wrong").addClass("valid_normal");
      }
    },
    phone: function (formId) {
      let userPhoneMsg = $(formId).find("div[id*='valid_userPhone");
      let elem = $(formId).find("input[name='userPhone']");
      // eslint-disable-next-line
      const reg = /(^(?!\+.*\(.*\).*\-\-.*$)(?!\+.*\(.*\).*\-$)(\+[0-9]{1} \([0-9]{3}\) [0-9]{3}[-]{1}[0-9]{2}[-]{1}[0-9]{2})$)|(^[0-9]{1,4}$)/;
      if (!reg.test(elem.val())) {
        Valid.errors = true;
        userPhoneMsg
          .addClass("valid_error")
          .html("← введите корректный номер телефона")
          .show();
        elem.removeClass("valid_normal").addClass("valid_wrong");
      } else {
        userPhoneMsg.removeClass("valid_error").hide();
        elem.removeClass("valid_wrong").addClass("valid_normal");
      }
    },
    checkbox: function (formId) {
      let politicMsg = $(formId).find("div[id*='valid_politic");
      let elem = $(formId).find("input[name='politic']");
      if (!elem.is(":checked")) {
        console.log("tut");
        Valid.errors = true;
        politicMsg
          .addClass("valid_error")
          .html("← примите политику обработки данных")
          .show();
        elem.removeClass("valid_normal").addClass("valid_wrong");
      } else {
        politicMsg.removeClass("valid_error").hide();
        elem.removeClass("valid_wrong").addClass("valid_normal");
      }
    },
    send: function (formId) {
      if (!Valid.errors) {
        let form = $(`.form-application ${formId}`);
        form.find("button").attr("disabled", true);

        setTimeout(() => {
          form.addClass("form_sended");
          form.siblings(".thx-message-form").addClass("form_res_success");
        }, 5000);
      }
    }
  };

  $("form").on("submit", function (e) {
    console.log("tut submit", this);
    let obj = $("body");
    let formId = "#" + this.id;
    console.log("formId", formId);
    if (formId === "#courier1") {
      obj.animate({ scrollTop: $(formId).offset().top }, 750, function () {
        Valid.errors = false;
        Valid.name(formId);
        Valid.phone(formId);
        Valid.checkbox(formId);
        Valid.send(formId);
      });
    }
    if (formId === "#courier2") {
      obj.animate({ scrollTop: $(formId).offset().top }, 750, function () {
        Valid.errors = false;
        Valid.name(formId);
        Valid.phone(formId);
        Valid.checkbox(formId);
        Valid.send(formId);
      });
    }
    return false;
  });

  $("#userName1").change(Valid.fullName);
  $("#userPhone1").change(Valid.phone);
  $("#politic1").change(Valid.checkbox);

  $("#userName2").change(Valid.fullName);
  $("#userPhone2").change(Valid.phone);
  $("#politic2").change(Valid.checkbox);
});
  • Вопрос задан
  • 298 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@deantek Автор вопроса
немного поменял объект, вот мое решение, которое работает так, как надо
https://codesandbox.io/s/dank-river-edoye?file=/sr...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Asokr
В текст не вникал, отвечу на вопрос - используйте готовые решения. Я использую
https://github.com/posabsolute/jQuery-Validation-Engine
Отличный плагин с валидацией полей реалтайм...хоть 100500 форм на странице...
Ответ написан
@jsnk
Программист
Кнопку отправить скрыть. Ее заменить обычной кнопкой. На ее нажатие повесить валидацию и если все OK щелкнуть кнопку отправить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы