Проверка адреса email и номера телефона на javascript

Проверка адреса email и номера телефона на javascript

Предоставляя пользователю возможность заполнения полей на сайте, следует проверять введенные данные на валидность. Это позволит предупредить пользователя о случайных ошибках, а так же даст дополнительную защиту от спама. Ярким примером является форма обратной связи, обязательными полями которой часто бывают email и телефон. Займемся их проверкой на правильность заполнения с помощью javascript.

Информация лучше воспринимается на примерах, поэтому посмотрим готовую форму в действии:

Пожалуйста, заполните все поля формы!

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

Валидность адреса электронной почты

Рассмотрим адрес электронной почты (test@mail.ru). Вот его обязательные части:

  • Название (test) — один или много символов;
  • Знак собаки (@);
  • Доменное имя почтового сервера (mail) — один или много символов;
  • Точка (.);
  • Доменное имя первого уровня (ru) от двух до пяти букв.

Составим регулярное выражение для наших требований:

/^[w-.]+@[w-]+.[a-z]{2,4}$/i

Разберём правило по частям:

  1. Регулярное выражение должно открываться и закрываться символами «/». После закрывающегося символа можно указать директиву. В нашем случае такой директивной является «i», которая отключает проверку вводимых букв на регистр. То есть, становится не важно, ввели «test@mail.ru» или «Test@Mail.RU».
  2. Знаки «^» и «$» обозначают начало и конец проверяемой строки. Если их убрать, то правило вернет положительный результат даже если в начале или конце электронного адреса поставить запрещенные знаки. То есть, при вводе «%:&test@mail.ru#6&» функция проверки вернет положительный результат, так как в строке имеется последовательность символов, удовлетворяющая нашему правилу. Для исключения такой возможности указываем, что правило должно применяться ко всей строке, а не к её части.
  3. Блок «[w-.]+» отвечает за проверку названия ящика. В квадратных скобках указываем разрешенные символы: «w» — все латинские буквы, цифры и знак подчеркивания. Так же рекомендую добавлять знак тире и точку «-.». «+» после квадратных скобок указывает на возможность повторения символов — один или много раз.
  4. Далее идет знак собаки и доменное имя почтового сервера — «@[w-]+». Здесь практически тоже самое что и в предыдущем блоке. Исключаем только из набора символов точку.
  5. Осталось прописать правило для проверки наличия точки и корректности доменного имени верхнего уровня (ru,com,info). «.[a-z]{2,4}». Для обозначения знака точки мы указываем её с обратным слешем «.» Без него она будет восприниматься зарезервированным символом регулярки, который обозначает возможность наличия на её месте любого символа.

    За точкой должно следовать доменное имя верхнего уровня. Это минимум 2 латинские буквы — «[a-z]{2,4}».

Разобранный пример немного упрощен для лучшего восприятия. У него есть недостаток — первым знаком в email не может быть тире или точка, но приведенное регулярное выражение этого не учитывает. Чтобы это исправить следует его немного поправить:

/^[w]{1}[w-.]*@[w-]+.[a-z]{2,4}$/i

Проверка валидности номера телефона в javascript

С номером телефона ситуация сложнее, так как номер можно ввести десятками способов:

8 999 1234567
8 (999) 1234567
8 999 123-45-67
+7 (999) 123 45 67

Есть несколько выходов из ситуации:

  • продумать все возможные шаблоны и составлять для них правила;
  • заставить посетителя вводить телефон по определенному шаблону;
  • ограничиться проверкой на случайные ошибки.

Для форм обратной связи последний вариант кажется наилучшим. Во-первых, если человек не хочет указывать свой номер телефона, то никакие проверки на корректность не помогут. Он просто введет несуществующий или чужой номер. Во-вторых, посетители сайта не любят когда их загоняют в определенные рамки. Поэтому рекомендую использовать регулярное выражение следующего типа:

/^[d+][d() -]{4,14}d$/

В правиле указываем что первый символ должен быть обязательно цифрой или плюсом «[d+]», а последний только цифрой — «d». В середине разрешаем использовать скобоки, пробел и знак дефиса — «[d() -]{4,14}», от 4 до 14 символов. Так как скобки и пробел являются зарезервированными элементами регулярных выражений, перед ними ставим обратный слеш.

Для любителей жестких шаблонов приведу пример проверки номера вида 8 (999) 123-45-64

/^[d]{1} ([d]{2,3}) [d]{2,3}-[d]{2,3}-[d]{2,3}$/

Исходный код примера: html и javascript

Это полный код тестовой странички, на которой я использовал форму и js скрипты для отладки правил из этой статьи. Можете скопировать его и протестировать у себя на компьютере.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script type="text/javascript">
 
function ValidMail() {
    var re = /^[w-.]+@[w-]+.[a-z]{2,4}$/i;
    var myMail = document.getElementById('email').value;
    var valid = re.test(myMail);
    if (valid) output = 'Адрес эл. почты введен правильно!';
    else output = 'Адрес электронной почты введен неправильно!';
    document.getElementById('message').innerHTML = output;
    return valid;
}
 
function ValidPhone() {
    var re = /^[d+][d() -]{4,14}d$/;
    var myPhone = document.getElementById('phone').value;
    var valid = re.test(myPhone);
    if (valid) output = 'Номер телефона введен правильно!';
    else output = 'Номер телефона введен неправильно!';
    document.getElementById('message').innerHTML = document.getElementById('message').innerHTML+'<br />'+output;
    return valid;
}  
 
</script>

</head>

<body>
<p id="message" >Пожалуйста, заполните все поля формы!</p> 
E-mail: <input id="email" name="email" type="text" size="20" /><br /> 
Телефон: <input id="phone" name="phone" type="text" size="20" /><br /> 
<input name="button" type="submit" value="Проверить" onClick="ValidMail(); ValidPhone();" />
</body>

</html>

Это демонстрационная версия. В случае с формой обратной связи нам следует проводить проверку полей не при нажатии на кнопку, а при попытке отправить её:

<form action="/feedback/" method="post" onsubmit="return (ValidMail()&&ValidPhone())">

В этом случае форма отправится только если обе функции вернут значение «true».

Подскажите пожалуйста, как сделать проверку правильности написания email и телефона, пока сделал проверку на ненаполненность полей, но хотелось бы проверить правильность. И не могу подсветить textarea почему то таким же способом как input ((
Спасибо.

$("#sendMail").on("click", function () {



    //создаем экземпляр класс FormData, тут будем хранить всю информацию для отправки

    var formData = new FormData();



    //присоединяем наш файл

    jQuery.each($('#file_v')[0].files, function(i, file) {

        formData.append('file_v', file);

    });



    //присоединяем остальные поля

    let name = $("#name").val().trim();

    let email = $("#email").val().trim();

    let tel = $("#tel").val().trim();

    let number_order = $("#number_order").val().trim();

    let message = $("#message").val().trim();

    let checkbox_check = $("#checkbox_check").prop('checked');



    //проверяем поля на заполнение

    if (name === '' || email === '' || tel === '' || number_order === '' || message === '' || !checkbox_check) {

        $('.modal_error').show();

        $.each($('.input-box input'),function(i, v){

            if($(this).val() == ''){

                $(this).addClass('empty_field');

            }else{

                $(this).removeClass('empty_field');

            }

        });

        return false;

    }



    formData.append('name', name);

    formData.append('email', email);

    formData.append('tel', tel);

    formData.append('number_order', number_order);

    formData.append('message', message);





    //отправляем через ajax

    $.ajax({

        url: "assets/ajax/mail.php",

        type: "POST",

        dataType : "json",

        cache: false,

        contentType: false,

        processData: false,

        data: formData, //указываем что отправляем

        beforeSend: function () {

            $("#form_contact").prop("disable", true);

            $(".main-btn").attr("disabled", true);

            $( ".loading_mail").show();



        },

        success: function(data){

            //стереть данные из инпутов

            $("#form_contact").trigger("reset");

            /////////////**********////////////

            //убрать загрузачное окно

            $( ".loading_mail").hide();

            ////////////**********//////////////

            //убрать подсветку

            $('.input-box input').removeClass('empty_field');

            $(".main-btn").attr("disabled", false);

            $('.modal_success').show();

            console.log(data);

        }

    });

    return false;

});
.checkbox {



}



.checkbox__input {

  display: none;

}



.checkbox__input:checked + .checkbox__label::after {

  transform: scale(1);

}



.checkbox__label {

  font-size: 16px;

  line-height: 140%;

  display: inline-flex;

  align-items: center;

  position: relative;

  cursor: pointer;

}



.checkbox__label::before {

  content: "";

  align-self: flex-start;

  flex: 0 0 24px;

  height: 24px;

  background: #dcdce8;

  border-radius: 4px;

  margin: 0px 10px 0px 0px;



}





.checkbox__label::after {

  transition: transform 0.5s ease 0s;

  content: "";

  width: 16px;

  height: 16px;

  position: absolute;

  top: 4px;

  left: 4px;

  background: #f07d54;

  border-radius: 4px;

  transform: scale(0);

}





.checkbox__label a {

  color: #f07d54;

}





/*  Загрузка отправки формы обратной связи  */



.comment-form {

  position: relative;

}



.loading_mail{

  content: "";

  position: fixed;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  background: rgba(51, 51, 51, 0.9) url(loading.gif) center / 50px no-repeat;

  display: none;

}





.input-box input.empty_field {

  box-shadow: 0 0 10px red;

}



/* Custom dropdown */



/* Стили для неактивного модального окна */





/* стилизация содержимого страницы */





/* свойства модального окна по умолчанию */



   /* свойства модального окна по умолчанию */

 .modal {

   position: fixed;

   /* фиксированное положение */

   top: 0;

   right: 0;

   bottom: 0;

   left: 0;

   background: rgba(0, 0, 0, 0.5);

   /* цвет фона */

   z-index: 1050;

   /*opacity: 0;*/

   /* по умолчанию модальное окно прозрачно */

   -webkit-transition: opacity 400ms ease-in;

   -moz-transition: opacity 400ms ease-in;

   transition: opacity 400ms ease-in;

   /* анимация перехода */

   pointer-events: none;

   /* элемент невидим для событий мыши */

 }

/* при отображении модального окно */

.modal:target {

  /*opacity: 1;*/

  pointer-events: auto;

  overflow-y: auto;

}

/* ширина модального окна и его отступы от экрана */

.modal-dialog {

  position: relative;

  width: auto;

  margin: 10px;

}

@media (min-width: 576px) {

  .modal-dialog {

    max-width: 500px;

    margin: 30px auto;

  }

}

/* свойства для блока, содержащего контент модального окна */

.modal-content {

  position: relative;

  display: -webkit-box;

  display: -webkit-flex;

  display: -ms-flexbox;

  display: flex;

  -webkit-box-orient: vertical;

  -webkit-box-direction: normal;

  -webkit-flex-direction: column;

  -ms-flex-direction: column;

  flex-direction: column;

  background-color: #fff;

  -webkit-background-clip: padding-box;

  background-clip: padding-box;

  border: 1px solid rgba(0, 0, 0, .2);

  border-radius: .3rem;

  outline: 0;

}

@media (min-width: 768px) {

  .modal-content {

    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);

    box-shadow: 0 5px 15px rgba(0, 0, 0, .5);

  }

}

/* свойства для заголовка модального окна */

.modal-header {

  display: -webkit-box;

  display: -webkit-flex;

  display: -ms-flexbox;

  display: flex;

  -webkit-box-align: center;

  -webkit-align-items: center;

  -ms-flex-align: center;

  align-items: center;

  -webkit-box-pack: justify;

  -webkit-justify-content: space-between;

  -ms-flex-pack: justify;

  justify-content: space-between;

  padding: 15px;

  border-bottom: 1px solid #eceeef;

}

.modal-title {

  margin-top: 0;

  margin-bottom: 0;

  line-height: 1.5;

  font-size: 1.25rem;

  font-weight: 500;

}

/* свойства для кнопки "Закрыть" */

.close {

  float: right;

  font-family: sans-serif;

  font-size: 24px;

  font-weight: 700;

  line-height: 1;

  color: #000;

  text-shadow: 0 1px 0 #fff;

  /*opacity: .5;*/

  text-decoration: none;

}

/* свойства для кнопки "Закрыть" при нахождении её в фокусе или наведении */

.close:focus,

.close:hover {

  color: #000;

  text-decoration: none;

  cursor: pointer;

  opacity: .75;

}

/* свойства для блока, содержащего основное содержимое окна */

.modal-body {

  position: relative;

  -webkit-box-flex: 1;

  -webkit-flex: 1 1 auto;

  -ms-flex: 1 1 auto;

  flex: 1 1 auto;

  padding: 15px;

  overflow: auto;

}



#openModal-error {

  background: rgba(255, 0, 0, 0.6);

}



#openModal-success {

  background: rgba(0, 0, 0, 0.5);

}
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
 <form id="form_contact" action="" method="post" enctype="multipart/form-data" class="contact-one__form">  <!---->
                            <div class="row">
                                <div class="col-lg-6">
                                    <div class="input-box has-feedback nameBlock">
                                        <label for="name" class="control-label ">Имя*</label>
                                        <input required type="text" id="name" placeholder="Иван Иванов" name="name" value="" class="" >
                                    </div>
                                </div><!-- /.col-lg-6 -->
                                <div class="col-lg-6">
                                    <div class="input-box">
                                        <label for="email" class="control-label">Email-адрес*</label>
                                        <input required type="email" id="email" placeholder="Email" name="email" value="" class="">
                                    </div>
                                </div><!-- /.col-lg-6 -->
                                <div class="col-lg-6">
                                    <div class="input-box _req">
                                        <label for="tel" class="control-label">Номер телефона*</label>
                                        <input required type="tel" id="tel" placeholder="+79997772255" name="tel" value="" class="">
                                    </div>
                                </div><!-- /.col-lg-6 -->
                                <div class="col-lg-6">
                                    <div class="input-box">
                                        <label for="number_order" class="control-label">№ заказа*</label>
                                        <input required id="number_order" type="text" placeholder="0000000-я00" name="number_order" value="" class="">
                                    </div>
                                </div><!-- /.col-lg-6 -->
                                <div class="col-lg-12">
                                    <div class="input-box">
                                        <label for="message" class="control-label">Сообщение*</label>
                                        <textarea required class="_req" id="message" name="message"
                                        placeholder="Сообщение" class="">
                                        </textarea>
                                    </div>
                                </div><!-- /.col-lg-12 -->
                                <div class="col-lg-12">
                                    <div class="file">
                                        <div class="file__item">
                                            <input type=file id="file_v" name="file_v" accept="image/*,video/*" class="file__input">
                                            <div class="file__button">Прикрепить файл</div>
                                        </div>
                                        <div id="formPreview" class="file__preview"></div>
                                    </div>
                                </div>
                                <div class="col-lg-12">
                                    <div class="checkbox">
                                        <input required id="checkbox_check" checked type="checkbox" name="agreement" class="checkbox__input">
                                        <label for="checkbox_check" class="checkbox__label _error"><span>Я даю согласие на обработку персональных данных в соответствии с <a href="">Условиями</a>*</span></label>
                                    </div>
                                </div>
                                <div class="col-lg-12 text-left">
                                    <br>
                                    <button  id="sendMail" class="main-btn"> Отправить </button>
                                </div>
                            </div>
                        </form>

Мы напишем универсальный скрипт на JS для валидации полей формы. Данный скрипт будет сам определять, что поле проверяется на валидность. Для этого достаточно добавить в HTML-разметке кастомный атрибут в input.

При неправильном значении рамки поля input подсвечиваются красным, при правильном — зеленым. Кнопка отправки формы submit срабатывает только, если все поля заполнены корректно. Это все полезно, когда надо отправить данные в правильном виде на сервер.

В примере ниже проверяем поля на правильный ввод Email и телефона.

Саму форму мы писать не будем — это делали в предыдущем уроке. Либо можете скачать исходники с формой из первого урока.

Добавляем атрибуты к input’ам

Сначала обратимся к нашей разметке из первого урока. Открываем файл index.html. Нам необходимо добавить атрибуты для каждого input’a. К комментариях я написал, где добавить код.

<div class="input-box">
    <input
      type="text"
      placeholder="Ваше имя"
      name="name" <!-- добавить -->
      id="name" <!-- добавить --> 
      data-reg="^[А-ЯЁ][а-яё]*$" <!-- добавить -->
    />
    <label for="name">Только русские буквы</label> <!-- добавить -->
  </div>
  <div class="input-box">
    <input
      type="text"
      placeholder="Введите email"
      name="email"  <!-- добавить -->
      id="email"  <!-- добавить -->
      data-reg="^[-w.]+@([A-z0-9][-A-z0-9]+.)+[A-z]{2,4}$" <!-- добавить -->
    />
    <label for="email">В формате: name@mail.com</label> <!-- добавить -->
  </div>
  <div class="input-box">
    <input
      type="text"
      placeholder="Введите телефон"
      name="phone" <!-- добавить -->
      id="phone" <!-- добавить -->
      data-reg="^((+7|7|8)+([0-9]){10})$" <!-- добавить -->
    />
    <label for="phone">В формате: 88000000000 или 78000000000</label> <!-- добавить -->
  </div>

К Input добавляем атрибуты:

  1. name — для обращения к данным формы после отправки на сервер
  2. id — уникальный ID для считывания DOM-элемента в JavaScript
  3. data-reg — кастомный атрибут, содержит регулярное выражение для проверки на правильность ввода. Список регулярных выражений можно посмотреть по ссылке.

В теге Label мы указываем подсказку для пользователя.

Скрипт для валидации формы

В исходнике из предыдущего урока откройте файл app.js — он должен быть пустым. В начале считываем саму форму из файла index.html, а также все ее элементы.

const form = document.forms["form"]; // считываем форму
const formArr = Array.from(form); // формируем массив из элементов формы
const validFormArr = []; // в этом массиве хранятся поля, которые нужно проверить
const button = form.elements["button"]; // считываем кнопку

Далее мы формируем массив полей формы, которые будем проверять на валидность. Он называется validFormArr. Для этого мы сначала «прогоняем» массив всех полей формы и ищем те поле, в которых задан атрибут data-reg.

В конце добавляем обработчики событий для элемента формы form. Вызываем функцию inputHandler при событии input — т.е. вводе значений в поля. А функцию buttonHandler вызываем при клике по кнопке button.

formArr.forEach((el) => {
  if (el.hasAttribute("data-reg")) {
    el.setAttribute("is-valid", "0");
    validFormArr.push(el);
  }
});

form.addEventListener("input", inputHandler);
button.addEventListener("click", buttonHandler);

После пишем сами функции для проверки валидности. Первая функция inputHandler проверяет есть ли у выбранного поля атрибут data-reg, и если есть, вызывает другую функцию inputCheck, которая как раз проверяет валидность. Функция inputCheck принимает поле формы, считывает его значений, а также само регулярное выражение data-reg. После чего мы создаем объект RegExp, которые как раз нужен для работы с «регулярками». С помощью метода test проверяем соответствует ли введенное значение в поле нашему регулярному выражению. Если соответствует, то делаем поле зеленым. В противном случае красным.

function inputHandler({ target }) {
  if (target.hasAttribute("data-reg")) {
    inputCheck(target);
  }
}

function inputCheck(el) {
  const inputValue = el.value;
  const inputReg = el.getAttribute("data-reg");
  const reg = new RegExp(inputReg);
  if (reg.test(inputValue)) {
    el.setAttribute("is-valid", "1");
    el.style.border = "2px solid rgb(0, 196, 0)";
  } else {
    el.setAttribute("is-valid", "0");
    el.style.border = "2px solid rgb(255, 0, 0)";
  }
}

Последняя функция buttonHandler предназначена для обработки нажатия кнопки. В начале создаем массив allValid — в него мы будем добавлять логические значения (0 и 1) для проверки валидности каждого поля. Далее с помощью функции reduce проходим по массиву allValid. Если все поля валидные, то функция вернет true. Если хоть одно поле не соответствует маске, то вернет false. В конце проверяем итоговое значение isAllValid, если хоть одно поле не валидное — блокируем отправку формы.

function buttonHandler(e) {
  const allValid = [];
  validFormArr.forEach((el) => {
    allValid.push(el.getAttribute("is-valid"));
  });
  const isAllValid = allValid.reduce((acc, current) => {
    return acc && current;
  });

  if (!Boolean(Number(isAllValid))) {
    e.preventDefault();
  }
}

Исходный код на GitHub

Весь исходный код из данного урока вы можете скачать по ссылке с моего GitHub.

Задача. Необходимо решение для проверки поля ввода на соответствие формату email-адреса почты и номера телефона при отправке формы.

Заполните поля E-mail и Телефон.

E-mail:

Телефон:

Пример 1: Проверка ввода электронной почты и номера телефона на JS

Решение. На Javascript можно реализовать проверку вводимой информации с помощью регулярных выражений. Используем Код №1 из Примера №1. Телефон проверяем так, чтобы первая была «+» или цифра, остальные — цифры, скобки и пробелы.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<script type=«text/javascript»>

function ValidEmail() {

    var wpcraftMail = document.getElementById(’email’).value;

    var valid = regExpr.test(wpcraftMail);

    if (valid){

output = ‘Адрес E-mail введен <span style=»color:green»>правильно!</span>’;

} else {

output = ‘Адрес E-mail введен <span style=»color:red»>неправильно!</span>’;

}

document.getElementById(‘message’).innerHTML = output;

return valid;

}

function ValidPhone() {

    var regExpr = /^[d+][d() ]{4,14}d$/;

    var wpcraftPhone = document.getElementById(‘phone’).value;

    var valid = regExpr.test(wpcraftPhone);

    if (valid) {

output = ‘Номер телефона введен <span style=»color:green»>правильно!</span>‘;

} else {

output = ‘Номер телефона введен <span style=«color:red»>неправильно!</span>‘;

}

document.getElementById(‘message‘).innerHTML = document.getElementById(‘message‘).innerHTML+’<br />’+output;

return valid;

}  

</script>

<div class=«example-block»><p id=«message» style=«font-weight: 600;»>Заполните поля E-mail и Телефон.</p>

<div style=«display: flex;justify-content: space-evenly;flex-wrap: wrap;align-items: center;»>

<div>E-mail: <input id=«email» name=«email» type=«text» size=«20» /><br /></div>

<div>Телефон: <input id=«phone» name=«phone» type=«text» size=«20» /><br /></div>

<input style=«padding: 8px;» name=«button» type=«submit» value=«Проверить» onClick=«ValidEmail(); ValidPhone();» /></div></div>

Код №1: Проверка ввода электронной почты и номера телефона регулярным выражением

Суть в том, что на кнопку вешаем событие и при клике вызываем функции, которые получают содержимое полей и проверяют соответствие содержимого (в примере это функции ValidPhone и ValidEmail). В каждой функции мы содаем регулярные выражения (шаблоны), согласно котором будут проверяться вводимые данные.
Метод для регулярного выражения — .test(str) ищет совпадение и возвращает true/false, в зависимости от того, нашел ли он его или нет.

Источник realadmin.ru

JavaScript is a scripting programming language that also helps in validating the user’s information. Have you ever heard about validating forms? Here comes into the picture JavaScript, the Scripting language which is used for validations and verification. To get deeper into this topic let us understand with examples.

Form Validation: Form validation is validating the values which are entered by the end-user during a form submission. For validating a form, Regular Expression plays a vital role. Let’s see what Regular Expression means.

Regular Expression: A Regular Expression is an object that describes a pattern of characters. Regular Expressions are used to perform pattern-matching and search-and-replace functions on text. So, in this area JavaScript plays a major role in validating the values. To, get more idea about the terminology let us see through an example.

Let’s understand how to validate forms using REGULAR EXPRESSION in JavaScript through examples.

Example 1: Form validation (validating an email)

Assume a registration form that contains the basic details of the end-users like Name, Phone number, Email id, and Address. When the user enters the email id without the domain name and “@” symbol the form turns out an error that says “domain name not included”. Ever wonder how this happens? This happens due to the Regular Expressions in JavaScript. Regular Expression can be defined as a stopper(pattern -match) to the values which are not correct i.e., “indicating an error while the end-user is entering the wrong details instead of the given regular expression “. Some of the characters used are “[abc],[^abc],w,W,S”. Thus validating the email address entered by the end-user is done by JavaScript.

index.html

<!DOCTYPE html>

<html>

<head>

    <title>creating mailing system</title>

    <style>

        legend {

            display: block;

            padding-left: 2px;

            padding-right: 2px;

            border: none;

        }

    </style>

    <script type="text/javascript">

        function validate() {

            var user = document.getElementById("e").value;

            var user2 = document.getElementById("e");

            var re = /^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+$/;

            if (re.test(user)) {

                alert("done");

                return true;

            }

            else {

                user2.style.border = "red solid 3px";

                return false;

            }

        }

    </script>

</head>

<body bgcolor="cyan">

    <center>

        <h1>Email Registration</h1>

        <form>

            <fieldset style="width:300px">

                <legend>Registation Form</legend>

                <table>

                    <tr>

                        <input type="text" 

                            placeholder="firstname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="lastname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="email" 

                            placeholder="username@gmail.com" id="e">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" placeholder="password">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" placeholder="confirm">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" placeholder="contact">

                    </tr>

                    <br><br>

                    <tr>

                        <label>Gender:</label>

                        <select id="gender">

                            <option value="male">male</option>

                            <option value="female">female</option>

                            <option value="others">others</option>

                        </select>

                    </tr>

                    <br><br>

                    <tr><input type="submit" 

                        onclick="validate()" value="create">

                    </tr>

                </table>

            </fieldset>

        </form>

    </center>

</body>

</html>

Output:

This picture says a perfect email address is entered by the user, so the form is accepted and registration is done. When a person enters the wrong email the text box of the email is highlighted with red color border indicating it is an error.

Invalid email

Correct email and the form is submitted 

Example 2: Form Validation (validating phone number )

Suppose assume the same registration form. Ever wonder why the number should be started with only from 6, 7, 8, 9 and not the remaining numbers. Here, also the picture is played by Regular Expression which helps in validating one’s correct mobile number. Restricting the users to enter only 10 digits where the first digit should of numbers “6,7,8,9” and rest all digits can be of any number from 0-9 is done purely by regular expressions “[^6-9][,0-9]” which help in validating the forms whether the information entered is relevant to the pattern specified.

index.html

<!DOCTYPE html>

<html>

<head>

    <style>

        legend {

            display: block;

            padding-left: 2px;

            padding-right: 2px;

            border: none;

        }

    </style>

    <script type="text/javascript">

        function validate() {

            var user = document.getElementById("c").value;

            var user2 = document.getElementById("c");

            var re = /^[7-9][0-9]{9}$/;

            if (re.test(user)) {

                alert("done");

                return true;

            }

            else {

                user2.style.border = "red solid 3px";

                return false;

            }

        }

    </script>

</head>

<body bgcolor="cyan">

    <center>

        <h1>Email Registration</h1>

        <form>

            <fieldset style="width:300px">

                <legend>Registation Form</legend>

                <table>

                    <tr>

                        <input type="text" 

                            placeholder="firstname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="lastname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="email" 

                            placeholder="username@gmail.com">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" 

                            placeholder="password">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" 

                            placeholder="confirm">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="contact" id="c">

                    </tr>

                    <br><br>

                    <tr>

                        <label>Gender:</label>

                        <select id="gender">

                            <option value="male">male</option>

                            <option value="female">female</option>

                            <option value="others">others</option>

                        </select>

                    </tr>

                    <br><br>

                    <tr>

                        <input type="submit" 

                            onclick="validate()" value="create">

                    </tr>

                </table>

            </fieldset>

        </form>

    </center>

</body>

</html>

Output:

This picture says a perfect phone number is entered by the user, so the form is accepted and registration is done. Upon entering the wrong phone number the text box of the phone number is highlighted with red color border indicating it is an error.

Correct contact and email so form is submitted 

Invalid email and Contact 

Thus, Validating a form can be done through JavaScript in the web pages. It should be tie up with  HTML which is a markup language. Although many other languages came into the picture for validations JavaScript is the basic way to learn how to understand the validations performed in the webpages. 

JavaScript is a scripting programming language that also helps in validating the user’s information. Have you ever heard about validating forms? Here comes into the picture JavaScript, the Scripting language which is used for validations and verification. To get deeper into this topic let us understand with examples.

Form Validation: Form validation is validating the values which are entered by the end-user during a form submission. For validating a form, Regular Expression plays a vital role. Let’s see what Regular Expression means.

Regular Expression: A Regular Expression is an object that describes a pattern of characters. Regular Expressions are used to perform pattern-matching and search-and-replace functions on text. So, in this area JavaScript plays a major role in validating the values. To, get more idea about the terminology let us see through an example.

Let’s understand how to validate forms using REGULAR EXPRESSION in JavaScript through examples.

Example 1: Form validation (validating an email)

Assume a registration form that contains the basic details of the end-users like Name, Phone number, Email id, and Address. When the user enters the email id without the domain name and “@” symbol the form turns out an error that says “domain name not included”. Ever wonder how this happens? This happens due to the Regular Expressions in JavaScript. Regular Expression can be defined as a stopper(pattern -match) to the values which are not correct i.e., “indicating an error while the end-user is entering the wrong details instead of the given regular expression “. Some of the characters used are “[abc],[^abc],w,W,S”. Thus validating the email address entered by the end-user is done by JavaScript.

index.html

<!DOCTYPE html>

<html>

<head>

    <title>creating mailing system</title>

    <style>

        legend {

            display: block;

            padding-left: 2px;

            padding-right: 2px;

            border: none;

        }

    </style>

    <script type="text/javascript">

        function validate() {

            var user = document.getElementById("e").value;

            var user2 = document.getElementById("e");

            var re = /^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+$/;

            if (re.test(user)) {

                alert("done");

                return true;

            }

            else {

                user2.style.border = "red solid 3px";

                return false;

            }

        }

    </script>

</head>

<body bgcolor="cyan">

    <center>

        <h1>Email Registration</h1>

        <form>

            <fieldset style="width:300px">

                <legend>Registation Form</legend>

                <table>

                    <tr>

                        <input type="text" 

                            placeholder="firstname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="lastname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="email" 

                            placeholder="username@gmail.com" id="e">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" placeholder="password">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" placeholder="confirm">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" placeholder="contact">

                    </tr>

                    <br><br>

                    <tr>

                        <label>Gender:</label>

                        <select id="gender">

                            <option value="male">male</option>

                            <option value="female">female</option>

                            <option value="others">others</option>

                        </select>

                    </tr>

                    <br><br>

                    <tr><input type="submit" 

                        onclick="validate()" value="create">

                    </tr>

                </table>

            </fieldset>

        </form>

    </center>

</body>

</html>

Output:

This picture says a perfect email address is entered by the user, so the form is accepted and registration is done. When a person enters the wrong email the text box of the email is highlighted with red color border indicating it is an error.

Invalid email

Correct email and the form is submitted 

Example 2: Form Validation (validating phone number )

Suppose assume the same registration form. Ever wonder why the number should be started with only from 6, 7, 8, 9 and not the remaining numbers. Here, also the picture is played by Regular Expression which helps in validating one’s correct mobile number. Restricting the users to enter only 10 digits where the first digit should of numbers “6,7,8,9” and rest all digits can be of any number from 0-9 is done purely by regular expressions “[^6-9][,0-9]” which help in validating the forms whether the information entered is relevant to the pattern specified.

index.html

<!DOCTYPE html>

<html>

<head>

    <style>

        legend {

            display: block;

            padding-left: 2px;

            padding-right: 2px;

            border: none;

        }

    </style>

    <script type="text/javascript">

        function validate() {

            var user = document.getElementById("c").value;

            var user2 = document.getElementById("c");

            var re = /^[7-9][0-9]{9}$/;

            if (re.test(user)) {

                alert("done");

                return true;

            }

            else {

                user2.style.border = "red solid 3px";

                return false;

            }

        }

    </script>

</head>

<body bgcolor="cyan">

    <center>

        <h1>Email Registration</h1>

        <form>

            <fieldset style="width:300px">

                <legend>Registation Form</legend>

                <table>

                    <tr>

                        <input type="text" 

                            placeholder="firstname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="lastname" 

                            maxlength="10">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="email" 

                            placeholder="username@gmail.com">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" 

                            placeholder="password">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="password" 

                            placeholder="confirm">

                    </tr>

                    <br><br>

                    <tr>

                        <input type="text" 

                            placeholder="contact" id="c">

                    </tr>

                    <br><br>

                    <tr>

                        <label>Gender:</label>

                        <select id="gender">

                            <option value="male">male</option>

                            <option value="female">female</option>

                            <option value="others">others</option>

                        </select>

                    </tr>

                    <br><br>

                    <tr>

                        <input type="submit" 

                            onclick="validate()" value="create">

                    </tr>

                </table>

            </fieldset>

        </form>

    </center>

</body>

</html>

Output:

This picture says a perfect phone number is entered by the user, so the form is accepted and registration is done. Upon entering the wrong phone number the text box of the phone number is highlighted with red color border indicating it is an error.

Correct contact and email so form is submitted 

Invalid email and Contact 

Thus, Validating a form can be done through JavaScript in the web pages. It should be tie up with  HTML which is a markup language. Although many other languages came into the picture for validations JavaScript is the basic way to learn how to understand the validations performed in the webpages. 

Очень часто перед отправкой формы на сервер требуется проверить введённые данные, например, ввёл ли пользователь имя, email, установил ли пароль, совпадают ли пароли (если мы говорим про простую форму регистрации). Подобный код проверки может написать даже начинающий JavaScript-разработчик.

Очень часто перед отправкой формы на сервер требуется проверить введённые данные, например, ввёл ли пользователь имя, email, установил ли пароль, совпадают ли пароли (если мы говорим про простую форму регистрации). Подобный код проверки может написать даже начинающий JavaScript-разработчик. Сложность может вызывать разве что проверка корректности электронного адреса. Если проверять корректность email с помощью обычных проверок, то на выходе мы увидим некомпактный и неэффективный код, перегруженный множеством операторов if, и не факт, что он будет работать правильно. Например, все мы знаем, что в любом электронном адресе должен быть символ «@» и «.», но если проверить наличие в строке только этих символов, то проверка явно не будет полной. Например, мы не учитываем следующие ошибки:

  • @john.sm@
  • .john@
  • .john@corp.
  • .j@cor.@

Все эти адреса вряд ли можно назвать корректными. Какие есть варианты? Можно проверять, чтобы в строке был только один символ @. Но всё равно есть много неправильных вариантов. Например:

  • john.corp@company
  • джон@corp.com
  • john@corp..

Чтобы не загромождать код лишними проверками, есть один выход — использовать регулярные выражения. Только с помощью регулярных выражений можно быстро и компактно проверить правильность e-mail. Давайте напишем функцию emailValidation(), которая будет проверять правильность ввода электронного адреса:

function emailValidation(value) {

let txt = /^(([^<>()[]\.,;:s@"]+(.[^<>()[]\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/;

return txt.test(value);

}

Да, регулярное выражение очень сложное, но оно учитывает все возможные варианты правильного построения email и избавляет вас от множества ненужных проверок.

Осталось только написать функцию checkEmail, через которую мы будем передавать содержимое текстового поля email нашей функции emailValidation. Если она возвращает true, мы выводим сообщение ОК, в противном случае сообщаем, что адрес некорректный.

function checkEmail() {

let email = document.form.email.value;

if (emailValidation(email)) {

window.alert("OK");

} else {

window.alert("Email is incorrect");

}

}

Можно немного усложнить задачу и проверять адрес на лету, после ввода символов в поле. Поэтому мы перепишем функцию checkEmail так, чтобы оно выводило сообщение о корректности введённого адреса в определённый элемент документа. Результат мы будем выводить в span. Вот изменённый код:

function checkEmail() {

let email = document.form.email.value;

if (emailValidation(email)) {

document.getElementById('span1').innerText = 'OK';

} else {

document.getElementById('span1').innerText = 'Email is incorrect';

}

}

Логика функции осталась той же, изменился лишь способ отображения результата. Всё остальное — дело техники. Для проверки «на лету» нужно использовать событие onKeyDown для поля ввода:

<input type="text" name="email" id="email" onKeyDown="checkEmail();">

Аналогичным образом, используя это событие, можно проверить правильность других полей формы. Например, указал ли пользователь свой номер телефона. Ниже представлена функция для проверки номера телефона в международном формате:

function phoneValidation(value) {

return /^+d{1,2}(d{3})d{3}-d{2}-d{2}$/.test(value);

}

Обратите внимание, что функции проверки email и номера телефона выясняют, соответствуют ли введённые пользователем данные определённому шаблону. Они не проверяют существование такого email и номера телефона. Например, вы можете ввести +55(333)044-99-44. Это корректный номер телефона, т. е. такой номер может существовать, но существует ли — никто не знает. Проверить существование email можно только путём отправки сообщения на этот адрес, но этим никто не занимается. С технической точки зрения реализовать такую проверку можно: отправить email, получить ответ от сервера и выдать результат. Однако подобные проверки порождают ненужный трафик.

Также на некоторых сайтах есть возможность проверки не только корректности введённых данных, но и их допустимости. Например, вы при регистрации ввели email test@mail.ru. С точки зрения функции валидации он является корректным, поскольку соответствует регулярному выражению. Однако этот email может принадлежать другому пользователю, кто уже указал его при регистрации. К сожалению, Javascript не умеет непосредственно обращаться к базе данных, чтобы проверить, есть ли такой email в БД. Поэтому здесь есть два варианта:

  • Остановиться на функции emailValidation и отправлять данные на сервер в случае, если они похожи на правильные. Дальнейшей обработкой будет заниматься программа на сервере (как правило, это скрипт PHP).
  • Использовать технологию AJAX, позволяющую вызвать стороннюю программу для обработки данных. Например, наш сценарий вызовет PHP-скрипт, который проверит, указывался ли такой email при регистрации другого пользователя, и передаст результат проверки нашему JS-сценарию. Наш сценарий на основании полученного ответа выполнит определённые действия (сообщит пользователю, что email занят или свободен).

Валидация форм на стороне клиента

  • Назад (en-US)
  • Обзор: Forms
  • Далее

Перед отправкой данных на сервер важно убедиться, что все обязательные поля формы заполнены данными в корректном формате. Это называется валидацией на стороне клиента и помогает убедиться, что данные, введённые в каждый элемент формы, соответствуют требованиям. Данная статья проведёт вас через основные концепци и примеры валидации на стороне клиента.

Начальные требования: Владение компьютером, достаточное понимание HTML, CSS, и JavaScript.
Цель: Понять, что такое валидация на стороне клиента, почему это важно и как применять различные техники для её реализации.

Валидация на стороне клиента — это первичная проверка введённых данных, которая существенно улучшает удобство взаимодействия с интерфейсом; обнаружение некорректных данных на стороне клиента позволяет пользователю немедленно их исправить. Если же проверка происходит только на сервере, процесс заполнения может быть более трудоёмким, так как требует повторения одних и тех же действий отправки данных на сервер для получения обратного ответа с сообщением о том, что нужно исправить.

Однако, не следует рассматривать валидацию на стороне клиента как достаточную меру безопасности! Любые данные, отправляемые через форму, необходимо дополнительно проверять на безопасность и на стороне сервера, поскольку валидацию на стороне клиента достаточно просто обойти и она может не остановить злоумышленников. Чтобы лучше понимать потенциальные угрозы, рекомендуем ознакомиться с разделом Безопасность вебсайтов; валидация на стороне сервера выходит за рамки этого модуля, но о ней следует помнить.

Что такое валидация формы?

Зайдите на любой популярный сайт, имеющий форму регистрации. Вы заметите, что при вводе данных в неправильном формате, пользователя сразу уведомляют о наличии проблемы. Вы получите примерно такое сообщение:

  • «Обязательное поле» (Вы не можете оставить поле пустым).
  • «Пожалуйста, введите номер телефона в формате xxx-xxxx» (Чтобы данные считались корректными, их необходимо указать в определённом формате).
  • «Пожалуйста, введите корректный email-адрес» (вы ввели данные в неправильном формате).
  • «Длина пароля должна быть от 8 до 30 символов и включать одну заглавную букву, один символ, и одну цифру.» (Требования к формату данных достаточно конкретные).

Это называется валидацией формы. По мере ввода, браузер и/или сервер проверяют данные, чтобы определить, соответствуют ли они требуемому формату. Валидация, выполняемая в браузере, называется валидацией на стороне клиента, а выполняемая на сервере — валидацией на стороне сервера. В этом разделе мы сосредоточимся на валидации, выполняемой на стороне клиента.

Если формат корректен, приложение позволяет отправить данные на сервер и (обычно) сохранить в базу данных; в противном случае выводится сообщение с описанием того, что нужно исправить, позволяя ввести данные снова.

Мы хотим максимально упростить заполнение веб-форм. Тогда почему мы настаиваем валидации данных? На это есть три основные причины:

  • Мы хотим получать правильные данные в правильном формате. Наши приложения не будут работать должным образом, если данные от пользователей хранятся в неправильном формате, некорректны сами по себе или вовсе пропущены.
  • Мы хотим защитить данные пользователей. Принуждение пользователей вводить надёжные пароли облегчает защиту их аккаунтов.
  • Мы хотим защитить себя. Существует множество способов, позволяющих злоумышленникам с помощью незащищённых форм навредить приложению (смотрите Безопасность вебсайтов).

    Предупреждение: Никогда не доверяйте данным, передаваемым на сервер клиентской программой. Даже если ваша форма правильно валидируется и не допустит введение потенциально вредоносных данных на стороне клиента, злоумышленники по-прежнему могут изменить сетевой запрос.

Типы валидации на стороне клиента

Существует два типа валидации на стороне клиента, с которыми вы столкнётесь в Интернете:

  • Встроенная валидация форм использует функционал валидации HTML5, который мы неоднократно обсуждали в этом модуле. HTML5-валидация обычно не требует большого количества JavaScript-кода и демонстрирует лучшую производительность, но не настолько настраиваема, как валидация с помощью JavaScript.
  • JavaScript-валидация кодируется с помощью JavaScript. Она полностью настраиваема, но требует программирования всей логики (или использования библиотеки).

Использование встроенной валидации форм

Одной из самых важных функций элементов форм HTML5 (en-US) является способность валидировать бóльшую часть пользовательских данных без использования JavaScript. Это выполняется с помощью атрибутов валидации у элементов формы. Многие из них мы уже рассмотрели в этом курсе:

  • required: Определяет, что для отправки формы данное поле предварительно должно быть заполнено.
  • minlength и maxlength: Задаёт минимальную и максимальную длину текстовых данных (строк)
  • min и max: Задаёт минимальное и максимальное значение для поля, расчитанного на числовой тип данных
  • type: Определяет тип данных, на который рассчитано поле: число, email-адрес или какой-то другой предустановленный тип
  • pattern: С помощью регулярного выражения, определяет шаблон, которому должны соответствовать вводимые данные.

Если данные, введённые в поле формы, соответствуют правилам перечисленных выше атрибутов, они считаются валидными, если нет — не валидными

Когда элемент валиден, справедливы следующие утверждения:

  • Элемент соответствует CSS-псевдоклассу :valid, позволяющему стилизовать только валидные элементы.
  • Если пользователь пытается отправить данные, браузер отправит форму при условии, что ничто другое (например, JavaScript) не помешает ему это сделать

Когда элемент не валиден, справедливы следующие утверждения:

  • Элемент соответствует CSS-псевдоклассу :invalid или, в зависимости от ошибки, другим псевдоклассам (например, :out-of-range), которые позволяют применять определённые стили к элементам, не являющимся валидными.
  • Если пользователь пытается отправить данные, браузер заблокирует форму и выведет сообщение об ошибке.

Примеры встроенной валидации форм

В этом разделе мы протестируем некоторые из атрибутов, которые обсуждали выше.

Простой начальный файл

Давайте начнём с простого примера: поле, позволяющее указать своё предпочтение — банан или вишня. Этот пример включает обычное текстовое поле <input>, связанный с ним элемент <label> и кнопку отправки формы <button>. Исходный код можно найти на GitHub по адресу fruit-start.html, а ниже приведён рабочий пример.

<form>
  <label for="choose">Would you prefer a banana or cherry?</label>
  <input id="choose" name="i_like">
  <button>Submit</button>
</form>
input:invalid {
  border: 2px dashed red;
}

input:valid {
  border: 2px solid black;
}

Для начала скопируйте файл fruit-start.html в новую папку на вашем жёстком диске.

Атрибут required

Самым простым в HTML5-валидации является атрибут required. Добавьте его к элементу, чтобы сделать заполнение обязательным. Элемент с данным атрибутом соответствует CSS-псевдоклассу :required, а если поле ввода пустое, вместо отправки формы отобразится сообщение об ошибке. Пока поле пустое, оно также будет соответствовать CSS-псевдоклассу :invalid.

Добавьте к полю атрибут required, как показано ниже.

<form>
  <label for="choose">Would you prefer a banana or cherry? (required)</label>
  <input id="choose" name="i_like" required>
  <button>Submit</button>
</form>

Обратите внимание на CSS, который включён в файл примера:

input:invalid {
  border: 2px dashed red;
}

input:invalid:required {
  background-image: linear-gradient(to right, pink, lightgreen);
}

input:valid {
  border: 2px solid black;
}

Данный CSS задаёт полю красную пунктирную рамку, когда оно не валидно, а когда валидно — сплошную чёрную. Мы также добавили фоновый градиент для обязательных не валидных полей. Проверьте новое поведение в примере ниже:

Попробуйте отправить форму без введения значения. Обратите внимание, что не валидное поле получает фокус, появляется сообщение об ошибке («Заполните это поле») и блокируется отправка формы.

Наличие атрибута required у любого элемента, который его поддерживает, означает, что элемент соответствует CSS-псевдоклассу :required, независимо от того, имеет он значение или нет. Если элемент <input> не содержит значение, он будет соответствовать псевдоклассу :invalid.

Примечание: Для повышения удобства взаимодействия указывайте пользователям, какие поля являются обязательными. К тому же, этого требует руководство по обеспечению доступности WCAG. Требуйте обязательного ввода только тех данных, которые вам действительно нужны: например, так ли важно знать пол или должность пользователя?

Валидация с помощью регулярного выражения

Ещё одной полезной функцией валидации является атрибут pattern, который в виде значения принимает Регулярное выражение. Регулярное выражение (regex) — это шаблон, который может быть использован для сопоставления набора символов в текстовой строке, поэтому они идеально подходят для валидации формы и используются для множества других целей в JavaScript.

Регулярные выражения достаточно сложны, и мы не будем подробно рассматривать эту тему в данной статье. Ниже приведены несколько примеров, чтобы дать вам представление о том, как они работают.

  • a — Соответствует одному символу a (не b, не aa, и так далее).
  • abc — Соответствует символу a, за которой следует b, за которой следует c.
  • ab?c — Соответствует символу a, за которым опционально может следовать b, за которым следует c. ( ac или abc)
  • ab*c — Соответствует символу a, за которым опционально может следовать любое количество символов b, за которыми следует c. ( ac , abc, abbbbbc, и так далее).
  • a|b — Соответствует символу a или b.
  • abc|xyz — Соответствует в точности abc или в точности xyz (но не abcxyz или a или y, и так далее).

Есть еще много возможностей, которые мы не упомянули. Полный список со множеством примеров можно найти в документации по Регулярным выражениям

Давайте рассмотрим пример. Добавьте в атрибут pattern следующий шаблон:

<form>
  <label for="choose">Would you prefer a banana or a cherry?</label>
  <input id="choose" name="i_like" required pattern="[Bb]anana|[Cc]herry">
  <button>Submit</button>
</form>
input:invalid {
  border: 2px dashed red;
}

input:valid {
  border: 2px solid black;
}

Это даёт нам следующее обновление — опробуйте его:

В этом примере элемент <input> принимает одно из четырёх возможных значений: строку «banana», «Banana», «cherry», или «Cherry». Регулярные выражения чувствительны к регистру, но с помощью шаблона «Aa», вложенного в квадратные скобки, мы сделали поддержку написания слова как с большой, так и с маленькой буквы.

Подставьте в атрибут pattern приведённые выше примеры регулярных выражений, и посмотрите, как это повлияет на валидацию введённого в поле значения. Попробуйте написать свои шаблоны проверки и посмотрите, что получится. По возможности, делайте их связанными с фруктами, чтобы примеры имели смысл.

Если не пустое значение элемента <input> не соответствует шаблону регулярного выражения, input будет соответствовать псевдоклассу :invalid.

Примечание: Некоторым типам элементов <input> для валидации с помощью регулярного выражения не требуется атрибут pattern. Например, поле с типом email валидирует значение по шаблону одного email-адреса или, если присутствует атрибут multiple (en-US), шаблону списка email-адресов, разделённых запятыми.

Ограничение длины вводимых значений

Можно ограничить максимально допустимое количество символов для текстовых полей <input> или <textarea> (en-US) используя атрибуты minlength (en-US) и maxlength. Поле будет не валидным, если количество символов его содержимого будет меньше minlength (en-US) или больше maxlength.

Зачастую браузеры не позволяют пользователям вводить в текстовое поле значение, длина которого превышает максимально допустимую. Можно существенно повысить удобство использования, если помимо ограничения в атрибуте maxlength добавить доступный индикатор, отображающий текущее и максимально допустимое количество символов, что даст пользователю возможность уместить содержимое в заданные рамки. Хорошим примером является окно написания твита в Twitter. Для реализации такого функционала можно использовать JavaScript, включая решения, использующие maxlength.

Ограничение допустимых значений

В полях, предназначенных для ввода чисел (например, <input type="number">), диапазон допустимых значений можно определить с помощью атрибутов min и max. Если поле содержит значение за пределами данного диапазона, оно будет не валидным.

Давайте рассмотрим другой пример. Создайте новую копию файла fruit-start.html.

Содержимое элемента <body> замените на:

<form>
  <div>
    <label for="choose">Would you prefer a banana or a cherry?</label>
    <input type="text" id="choose" name="i_like" required minlength="6" maxlength="6">
  </div>
  <div>
    <label for="number">How many would you like?</label>
    <input type="number" id="number" name="amount" value="1" min="1" max="10">
  </div>
  <div>
    <button>Submit</button>
  </div>
</form>
  • Здесь мы в поле с типом text атрибутам minlength и maxlength, задали одинаковое значение 6, что соответствует количеству символов в словах banana и cherry.
  • В поле с типом number атрибуту min мы задали значение 1, а атрибуту max значение 10. При вводе чисел за пределами данного диапазона, поле будет становиться не валидным; с помощью стрелок увеличения/уменьшения пользователи не смогут выйти за границы диапазона. Текущее поле не является обязательным для заполнения, поэтому даже после очистки будет оставаться валидным.
input:invalid {
  border: 2px dashed red;
}

input:valid {
  border: 2px solid black;
}

div {
  margin-bottom: 10px;
}

Демонстрационный пример:

Примечание: <input type="number"> (и другие типы, такие как range и date) могут также принимать атрибут step (en-US), который задаёт шаг увеличения или уменьшения значения при использовании кнопок вверх и вниз. В примере выше мы явно не указывали атрибут step, поэтому он получает значение по умолчанию, равное 1. Это значит, что дробные числа, такие как 3.2, будут не валидными.

Полный пример

Ниже представлен полный пример, демонстрирующий использование встроенного функционала валидации. Сначала немного HTML:

<form>
  <p>
    <fieldset>
      <legend>Do you have a driver's license?<abbr title="This field is mandatory" aria-label="required">*</abbr></legend>
      <!-- Так как в группе радио-кнопок, имеющих одинаковое имя, выбранной может быть
          только одна, то и атрибут "required" достаточно задать хотя бы одной кнопке,
          чтобы сделать всю группу обязательной для заполнения -->
      <input type="radio" required name="driver" id="r1" value="yes"><label for="r1">Yes</label>
      <input type="radio" required name="driver" id="r2" value="no"><label for="r2">No</label>
    </fieldset>
  </p>
  <p>
    <label for="n1">How old are you?</label>
    <!-- Атрибут "pattern" может выступать фолбэком для браузеров, которые
        не поддерживают поля ввода c числовым типом данных. Те браузеры,
        которые такие поля поддерживают, будут просто игнорировать его.
        Как раз, ниже атрибут "pattern" выполняет роль фолбека.
     -->
    <input type="number" min="12" max="120" step="1" id="n1" name="age"
           pattern="d+">
  </p>
  <p>
    <label for="t1">What's your favorite fruit?<abbr title="This field is mandatory" aria-label="required">*</abbr></label>
    <input type="text" id="t1" name="fruit" list="l1" required
           pattern="[Bb]anana|[Cc]herry|[Aa]pple|[Ss]trawberry|[Ll]emon|[Oo]range">
    <datalist id="l1">
      <option>Banana</option>
      <option>Cherry</option>
      <option>Apple</option>
      <option>Strawberry</option>
      <option>Lemon</option>
      <option>Orange</option>
    </datalist>
  </p>
  <p>
    <label for="t2">What's your e-mail address?</label>
    <input type="email" id="t2" name="email">
  </p>
  <p>
    <label for="t3">Leave a short message</label>
    <textarea id="t3" name="msg" maxlength="140" rows="5"></textarea>
  </p>
  <p>
    <button>Submit</button>
  </p>
</form>

И немного CSS для стилизации HTML:

form {
  font: 1em sans-serif;
  max-width: 320px;
}

p > label {
  display: block;
}

input[type="text"],
input[type="email"],
input[type="number"],
textarea,
fieldset {
  width : 100%;
  border: 1px solid #333;
  box-sizing: border-box;
}

input:invalid {
  box-shadow: 0 0 5px 1px red;
}

input:focus:invalid {
  box-shadow: none;
}

Получим следующее:

В статье Атрибуты валидации (en-US) можно найти полный список атрибутов, которые можно использовать для ограничения допустимых значений ввода и типов полей input, которые их поддерживают.

Валидация форм с помощью JavaScript

Если нужно управлять внешним видом встроенных сообщений об ошибке или работать с устаревшими браузерами, которые не поддерживают встроенную валидацию форм HTML, вам следует использовать JavaScript. В данном разделе мы рассмотрим различные способы делать это.

Constraint Validation API

Большинство браузеров поддерживают Constraint Validation API, который состоит из набора свойств и методов, доступных на DOM-интерфейсах следующих элементов форм:

  • HTMLButtonElement (представляет элемент <button>)
  • HTMLFieldSetElement (представляет элемент <fieldset>)
  • HTMLInputElement (представляет элемент <input>)
  • HTMLOutputElement (представляет элемент <output>)
  • HTMLSelectElement (представляет элемент <select>)
  • HTMLTextAreaElement (представляет элемент <textarea>)

Для перечисленных выше элементов Constraint Validation API делает доступными следующие свойства.

  • validationMessage: Возвращает локализованное сообщение, описывающее ограничения валидации (если таковые имеются), которым не удовлетворяет определённый элемент. Если элемент не участвует в валидации (willValidate установлено в false) или значение элемента удовлетворяет установленным ограничениям (является валидным), будет возвращена пустая строка.
  • validity: Возвращает объект ValidityState, который содержит несколько свойств, описывающих состояние валидности элемента. Подробное описание всех свойств доступности можно найти на странице справочника ValidityState; ниже приведён список наиболее используемых:
    • patternMismatch: Возвращает true, если значение не соответствует шаблону, указанному в атрибуте pattern, и false если соответствует. Если true, элемент соответствует CSS-псевдоклассу :invalid.
    • tooLong: Возвращает true, если значение длиннее максимальной длины, указанной в атрибуте maxlength, и false если оно короче или равно ей. Если true, элемент соответствует CSS-псевдоклассу :invalid.
    • tooShort: Возвращает true, если значение короче минимальной длины, указанной в атрибуте minlength, и false если оно длинее или равно ей. Если true, элемент соответствует CSS-псевдоклассу :invalid.
    • rangeOverflow: Возвращает true, если значение больше указанного в атрибуте max максимума, и false если меньше или равно ему. Если true, элемент соответствует CSS-псевдоклассам :invalid и :out-of-range
    • rangeUnderflow: Возвращает true, если значение меньше указанного в атрибуте min, и false если больше или равно ему. Если true, элемент соответствует CSS-псевдоклассу :invalid и :out-of-range.
    • typeMismatch: Возвращает true, если значение не соответствует требуемому синтаксису (когда для type задано значение email или url), и false если синтаксис корректный. Если true, элемент соответствует CSS-псевдоклассу :invalid.
    • valid: Возвращает true, если элемент соответствует всем ограничениям валидации — следовательно, считается валидным, и false если не соответствует какому-то ограничению. Если true, элемент соответствует CSS-псевдоклассу :valid; иначе :invalid.
    • valueMissing: Возвращает true, если у элемента есть атрибут required, но не введено значенение, иначе возвращает false. Если true, элемент соответствует CSS-псевдоклассу :invalid.
  • willValidate: Возвращает true, если элемент будет участвовать в валидации при отправке формы; иначе возвращает false.

Также для перечисленных выше элементов Constraint Validation API делает доступными следующие методы.

  • checkValidity(): Возвращает true, если значение элемента проходит валидацию, иначе возвращает false. Если элемент не валиден, данный метод также запускает на нём событие invalid.
  • setCustomValidity(message): Позволяет добавить в элемент кастомное сообщение об ошибке; при этом элемент будет считаться не валидным и отобразится указанная ошибка. Это позволяет использовать JavaScript-код, чтобы представить ошибку валидации иначе, чем это предусмотрено стандартными средствами валидации HTML5. При сообщении об ошибке данное кастомное сообщение показывается пользователю.

Реализация кастомного сообщения об ошибке

Как вы видели в примерах HTML5-валидации выше, каждый раз, когда пользователь пытается отправить не валидную форму, браузер отображает сообщение об ошибке. Способ отображения сообщения зависит от браузера.

У этих автоматических сообщений есть два недостатка:

  • Не существует стандартного способа их стилизации с помощью CSS.
  • Они зависят от локали браузера, из-за чего страница может быть на одном языке, а сообщение об ошибке — на другом, как показано на следующем скриншоте браузера Firefox.

Пример сообщения об ошибке на англоязычной странице в браузере Firefox с настроенным французским языком

Настройка таких сообщений об ошибках является одной из наиболее распространённых причин использования Constraint Validation API. Давайте рассмотрим простой пример, как это делается.

Начнём с простого HTML (Не стесняйтесь поместить это в пустой HTML-файл. Вы можете взять за основу свежую копию fruit-start.html, если хотите):

<form>
  <label for="mail">I would like you to provide me with an e-mail address:</label>
  <input type="email" id="mail" name="mail">
  <button>Submit</button>
</form>

Добавьте на страницу следующий JavaScript:

const email = document.getElementById("mail");

email.addEventListener("input", function (event) {
  if (email.validity.typeMismatch) {
    email.setCustomValidity("I am expecting an e-mail address!");
  } else {
    email.setCustomValidity("");
  }
});

Здесь мы сохраняем ссылку на поле email, а затем добавляем к нему обработчик события, который запускает код обработчика каждый раз, когда в поле меняется значение.

В коде обработчика мы проверяем, возвращает ли свойство поля email validity.typeMismatch значение true, что значит, что содержащееся значение не соответствует шаблону корректного email-адреса. Если возвращается true, мы вызываем метод setCustomValidity() (en-US) с кастомным сообщением. Это делает поле не валидным, поэтому попытка отправить форму приводит к ошибке и отображается кастомное сообщение об ошибке.

Если свойство validity.typeMismatch возвращает false, мы вызываем метод setCustomValidity() с пустой строкой. Это делает поле валидным, поэтому форма может быть успешно отправлена.

Попробовать пример можно ниже:

Более подробный пример

Теперь, когда мы разобрали простой пример, давайте посмотрим, как можно использовать данный API для создания более сложной валидацию.

Во-первых, HTML. Опять же, не стесняйтесь писать его вместе с нами:

<form novalidate>
  <p>
    <label for="mail">
      <span>Please enter an email address:</span>
      <input type="email" id="mail" name="mail" required minlength="8">
      <span class="error" aria-live="polite"></span>
    </label>
  </p>
  <button>Submit</button>
</form>

Эта простая форма использует атрибут novalidate, который отключает автоматическую валидацию браузером; это позволяет нашему скрипту взять управление валидацией на себя. Однако, это не отменяет поддержку Constraint Validation API или псевдоклассов, таких как :valid или ему подобных. Это значит, что хотя браузер автоматически и не проверяет валидность формы перед отправкой данных, вы можете сделать это самостоятельно и соответствующим образом стилизовать форму.

Объектом валидации является обязательный для заполнения <input type="email">, длина которого не должна быть меньше 8 символов. Давайте напишем код, проверяющий эти критерии, и покажем кастомное сообщение об ошибке в случае несоблюдения какого-то из них.

Мы хотим показывать сообщение об ошибке внутри элемента <span>. Данному элементу задан атрибут aria-live, чтобы гарантировать, что наше кастомное сообщение об ошибке будет доступно всем, включая пользователей скринридеров.

Примечание: Ключевым моментом здесь является то, что добавление к форме атрибута novalidate отключает отображение встроенных сообщений об ошибке и позволяет вместо этого добавлять в DOM кастомные сообщения.

Перейдём к базовому CSS, чтобы немного улучшить внешний вид формы и обеспечить визуальную обратную связь при введении не валидных данных:

body {
  font: 1em sans-serif;
  width: 200px;
  padding: 0;
  margin : 0 auto;
}

p * {
  display: block;
}

input[type=email]{
  -webkit-appearance: none;
  appearance: none;

  width: 100%;
  border: 1px solid #333;
  margin: 0;

  font-family: inherit;
  font-size: 90%;

  box-sizing: border-box;
}

/* Это стили для не валидных полей */
input:invalid{
  border-color: #900;
  background-color: #FDD;
}

input:focus:invalid {
  outline: none;
}

/* Это стили для кастомных сообщений об ошибке */
.error {
  width  : 100%;
  padding: 0;

  font-size: 80%;
  color: white;
  background-color: #900;
  border-radius: 0 0 5px 5px;

  box-sizing: border-box;
}

.error.active {
  padding: 0.3em;
}

Теперь давайте рассмотрим JavaScript, который реализует кастомную валидацию.

// Существуют разные способы получить DOM-узел; здесь мы определяем саму форму и
// поле ввода email и элемент span, в который поместим сообщение об ошибке
const form  = document.getElementsByTagName('form')[0];

const email = document.getElementById('mail');
const emailError = document.querySelector('#mail + span.error');

email.addEventListener('input', function (event) {
  // Каждый раз, когда пользователь что-то вводит,
  // мы проверяем, являются ли поля формы валидными

  if (email.validity.valid) {
    // Если на момент валидации какое-то сообщение об ошибке уже отображается,
    // если поле валидно, удаляем сообщение
    emailError.textContent = ''; // Сбросить содержимое сообщения
    emailError.className = 'error'; // Сбросить визуальное состояние сообщения
  } else {
    // Если поле не валидно, показываем правильную ошибку
    showError();
  }
});

form.addEventListener('submit', function (event) {
  // Если поле email валдно, позволяем форме отправляться

  if(!email.validity.valid) {
    // Если поле email не валидно, отображаем соответствующее сообщение об ошибке
    showError();
    // Затем предотвращаем стандартное событие отправки формы
    event.preventDefault();
  }
});

function showError() {
  if(email.validity.valueMissing) {
    // Если поле пустое,
    // отображаем следующее сообщение об ошибке
    emailError.textContent = 'You need to enter an e-mail address.';
  } else if(email.validity.typeMismatch) {
    // Если поле содержит не email-адрес,
    // отображаем следующее сообщение об ошибке
    emailError.textContent = 'Entered value needs to be an e-mail address.';
  } else if(email.validity.tooShort) {
    // Если содержимое слишком короткое,
    // отображаем следующее сообщение об ошибке
    emailError.textContent = `Email should be at least ${ email.minLength } characters; you entered ${ email.value.length }.`;
  }

  // Задаём соответствующую стилизацию
  emailError.className = 'error active';
}

Комментарии объясняют логику хорошо, но кратко:

  • При каждом изменении значения поля, мы производим его валидацию. Если данные валидны, удаляем ранее отображаемые сообщения об ошибках. Если данные не валдны, запускаем showError(), чтобы показать соответствующую ошибку.
  • При каждой попытке отправить форму, мы снова производим валидацию. Если данные валидны, позволяем отправку формы. Если данные не валидны, запускам showError(), чтобы показать соответствующее сообщение об ошибке, а также предотвращаем отправку формы с помощью preventDefault().
  • Функция showError() использует различные свойства объекта validity поля ввода, чтобы определить тип ошибки и отобразить соответсвущее сообщение.

Рабочий пример:

Constraint Validation API явяется мощным инструментом валидации форм, позволяющим получить контроль над пользовательским интерфейсом, существенно превосходящий возможности HTML и CSS.

Проверка форм без встроенного API

В некоторых случаях, например, при необходимости поддержки устаревших браузеров или кастомных элементов формы, вы не сможете или не захотите использовать Constraint Validation API. Вы по-прежнему сможете использовать JavaScript для валидации форм, но для этого всё нужно будет писать самостоятельно.

Для создания своего валидатора формы, задайте себе несколько вопросов:

Какую тип валидации я должен выполнить?

Вам нужно определить, как данные будут валидироваться: с помощью строковых операций, преобразования типов, регулярных выражений и так далее. Решать вам.

Что мне нужно делать, если форма не проходит валидацию?

Это явно вопрос пользовательского интерфейса. Вы должны решить, как в этом случае будет себя вести форма. Будет ли она в любом случае отправлять данные? Нужно ли выделять поля, содержащие ошибки? Нужно ли отображать сообщения об ошибках?

Как я могу помочь пользователю исправить не валидные данные?

Чтобы снизить степень разочарования пользователя, очень важно предоставить как можно больше полезной информации, чтобы помочь исправить данные, которые он ввёл неправильно. Нужно предложить правильные варианты, чтобы дать понять, какие данные вы ожидаете от него получить, а также сообщение, чётко описывающее ошибку. Если вы хотите подробнее ознакомиться с требованиями к пользовательскому интрефейсу при валидации форм, предлагаем прочитать следующие статьи:

  • SmashingMagazine: Form-Field Validation: The Errors-Only Approach
  • SmashingMagazine: Web Form Validation: Best Practices and Tutorials
  • WebFX: 10 Tips for Optimizing Web Form Submission Usability
  • A List Apart: Inline Validation in Web Forms

Пример без использования Constraint Validation API

Чтобы проиллюстрировать это дальше приводится упрощённая версия предыдущего примера, которая работает с устаревшими браузерами.

HTML почти тот такой же; мы только удалили функционал валидации HTML5.

<form>
  <p>
    <label for="mail">
        <span>Please enter an email address:</span>
        <input type="text" id="mail" name="mail">
        <span class="error" aria-live="polite"></span>
    </label>
  </p>
  <!-- Для некоторых устаревших браузеров элементу `button` нужно добавлять
       атрибут `type` с явно заданным значением `submit` -->
  <button type="submit">Submit</button>
</form>

CSS также не требует особых изменений; мы только заменили CSS-псевдокласс :invalid на реальный класс и не использовали селектор по атрибутам, так как он не работает в Internet Explorer 6.

body {
  font: 1em sans-serif;
  width: 200px;
  padding: 0;
  margin : 0 auto;
}

form {
  max-width: 200px;
}

p * {
  display: block;
}

input.mail {
  -webkit-appearance: none;

  width: 100%;
  border: 1px solid #333;
  margin: 0;

  font-family: inherit;
  font-size: 90%;

  box-sizing: border-box;
}

/* Стилизация не валидных полей */
input.invalid{
  border-color: #900;
  background-color: #FDD;
}

input:focus.invalid {
  outline: none;
}

/* Стилизация сообщений об ошибках */
.error {
  width  : 100%;
  padding: 0;

  font-size: 80%;
  color: white;
  background-color: #900;
  border-radius: 0 0 5px 5px;
  box-sizing: border-box;
}

.error.active {
  padding: 0.3em;
}

Существенно изменился только JavaScript-код, который теперь должен выполнять гораздо больше работы.

// Устаревшие браузеры поддерживают несколько способов получения DOM-узла
const form  = document.getElementsByTagName('form')[0];
const email = document.getElementById('mail');

// Ниже приведён способ получения узла следующего родственного DOM-элемента
// Он опасен, потому что можно создать бесконечный цикл.
// В современных браузерах лучше использовать `element.nextElementSibling`
let error = email;
while ((error = error.nextSibling).nodeType != 1);

// Согласно спецификации HTML5
const emailRegExp = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/;

// Многие устаревшие браузеры не поддерживают метод `addEventListener`
// Есть простой способ заменить его; и далеко не единственный
function addEvent(element, event, callback) {
  let previousEventCallBack = element["on"+event];
  element["on"+event] = function (e) {
    let output = callback(e);

    // Колбэк, который возвращает `false`, останавливает цепочку колбэков
    // и прерывает выполнение колбэка события
    if (output === false) return false;

    if (typeof previousEventCallBack === 'function') {
      output = previousEventCallBack(e);
      if(output === false) return false;
    }
  };
}

// Теперь мы можем изменить наши критерии валидации
// Поскольку мы не полагаемся на CSS-псевдокласс, для поля email
// нужно явно задать валидный / не валидный класс
addEvent(window, "load", function () {
  // Проверка, является ли поле пустым (помните, оно не являтеся обязательным)
  // Если поле не пустое, проверяем содержимое на соответствует шаблону email
  const test = email.value.length === 0 || emailRegExp.test(email.value);

  email.className = test ? "valid" : "invalid";
});

// Здесь определяется поведение при вводе пользователем значения поля
addEvent(email, "input", function () {
  const test = email.value.length === 0 || emailRegExp.test(email.value);
  if (test) {
    email.className = "valid";
    error.textContent = "";
    error.className = "error";
  } else {
    email.className = "invalid";
  }
});

// Здесь определяется поведение при попытке отправить данные
addEvent(form, "submit", function () {
  const test = email.value.length === 0 || emailRegExp.test(email.value);

  if (!test) {
    email.className = "invalid";
    error.textContent = "I expect an e-mail, darling!";
    error.className = "error active";

    // Некоторые устаревшие браузеры не поддерживают метод event.preventDefault()
    return false;
  } else {
    email.className = "valid";
    error.textContent = "";
    error.className = "error";
  }
});

Результат выглядит следующим образом:

Как вы можете видеть, сделать собственную валидацию не так уж и сложно. Сложность состоит лишь в том, чтобы сделать его кроссплатформенным и работающим с любой формой, которую можно создать. Для проверки формы доступно множество библиотек, например Validate.js.

Проверьте свои навыки!

Вы дошли до конца этой статьи, но можете ли вы вспомнить самую важную информацию? Вы можете найти дополнительные тесты, чтобы убедиться, что вы сохранили эту информацию, прежде чем двигаться дальше — Test your skills: Form validation (en-US).

Заключение

Для проверки формы на стороне клиента иногда требуется JavaScript, если вы хотите настроить стилизацию и сообщения об ошибках, но это всегда требует от вас внимательного отношения к пользователю. Всегда помните о необходимости помогать пользователям исправлять данные, которые они вводят. Для этого обязательно нужно:

  • Отображать явные сообщения об ошибках.
  • Снисходительно относиться к формату ввода.
  • Указывать, где именно возникла ошибка. Особенно в больших формах.

После того, как вы убедились, что форма заполнена правильно, ее можно отправлять. Дальше мы рассмотрим отправку данных формы.

  • Назад (en-US)
  • Обзор: Forms
  • Далее

In this module

Продвинутые темы

Опубликовано: пятница, 4 февраля 2022 г. в 09:23

  • JavaScript
  • Frontend
  • HTML

Проверка формы — одна из основных причин использования клиентского JavaScript. Это может предотвратить ошибки ввода пользователя до того, как выше приложение попытается отправить данные на сервер. Но…

Проверка на стороне клиента не заменяет проверку на стороне сервера!

Всегда проверяйте входящие пользовательские данные на сервере. Не каждый запрос будет исходить от браузера, и не каждый браузер будет запускать код проверки. Проверка на стороне клиента — это усовершенствование, которое делает вашу систему более удобной в использовании.

Тем не менее вам может не потребоваться JavaScript для более простой проверки формы…

Проверка поля HTML5

Современные браузеры, поддерживающие HTML5, могут проверять поля без JavaScript. Атрибут type устанавливает ограничения и может изменять пользовательский интерфейс стандартного поля <input>:

Если вы не указываете или используете неподдерживаемый атрибут, браузер назначает полю тип text. Это должно позволить пользователю вводит данные в старых браузерах, даже если это не может быть проверено автоматически.

Другие атрибуты управления ограничениями включают:

Интерфейс input

Типы полей и атрибуты ограничений могут изменить поведение пользовательского интерфейса браузера. Ввод числа показывает цифровую клавиатуру на мобильных устройствах, а также может отображать счётчик и разрешать нажатия клавиш вверх/вниз для увеличения и уменьшения значений.

Используйте самый очевидный тип type, но будьте осторожны с особыми случаями, такими как кредитные карты. Это числовые значения, но ролик мыши и курсорные клавиши бесполезны. Лучше использовать стандартный ввод text:

<input
type="text"
name="ccnumber"
inputmode="numeric"
autocomplete="cc-number"
/>

Браузер может предлагать такие функции, как съёмка камерой или подтверждение по SMS, когда встречает тип autocomplete.

Встроенная проверка/валидация

Браузер гарантирует, что значение соответствует ограничениям атрибутов type, min, max, step, minlength, maxlength, pattern, и required:

<input type="number" min="1" max="100" required />

Попытка отправить пустое, недопустимое или выходящее за пределы диапазона, останавливает отправку формы и показывает общее сообщение об ошибке. Вы можете остановить проверку браузер по умолчанию, добавив:

    1. атрибут novalidate в <form>, или
    1. атрибут formnovalidate в кнопку отправки формы

CSS стили проверки/валидации

Следующие псевдоклассы позволяют стилизовать input в соответствии с его состоянием:

Эти селекторы имеют одинаковую специфичность, поэтому порядок не важен. Например:

input:invalid { color: red; }
input:enabled { color: blue; }

Поля input с недопустимыми значениями окрашиваются в красный, но это переопределяется, потому что все не отключённые поля выделены синим цветом.

Вы должны быть осторожны, потому что браузер применяет стили валидации при загрузке страницы. В следующем примере каждое поле считается не прошедшим валидацию и содержит текст красного цвета и обведено красной рамкой ещё до того, как пользователь взаимодействовал с формой:

:invalid {
color: red;
border-color: red;
}

Желательно отображать сообщения об ошибках и выделять их цветом после того, как пользователь взаимодействовал с полем формы или попытался отправить всю форму.

Constrain Validation API

Constraint Validation API предоставляет параметры настройки, которые могут улучшить или изменить стандартное поведение проверки полей HTML5. Вы можете выполнять проверку после взаимодействия с пользователем, отображать определённые сообщения об ошибках или реализовать программную проверку, например подтвердить:

  • поля нового пароля и подтверждения пароля совпадают

  • одна дата следует за другой

  • пользователь ввёл номер телефона, адрес электронной почты или и то, и другое.

В следующих разделах описывается общий подход к Constrain Validation API в вашем коде.

1. Отключение проверки формы по умолчанию

Ваш код должен отключать валидацию формы по умолчанию и сообщения об ошибках, установив свойство атрибута <form> noValidate = true, например:

const myform = document.getElementById('myform');
myform.noValidate = true;

2. Добавление обработчика событий формы

Далее, вы должны добавить обработчик событий для отправки формы или изменения отдельных полей, например:

// валидация формы при отправке
myform.addEventListener('submit', validateForm);

Функция обработчик может проверить, что вся форма валидна используя методы элемента формы:

  1. checkValidity() — возвращает true, если все дочерние элементы соответствуют ограничениям и проходят валидацию.

  2. reportValidity() — возвращает true, если дочерний элемент не подлежит валидации или соответствует ограничениям.

Обратите внимание, что оба метода вызывают событие invalid event для каждого не валидного поля. Оно не всплывает, поэтому обработчики должны быть установлены по мере необходимости для каждого поля.

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

// Валидация формы при отправке
function validateForm(e) {

const form = e.target;

if (!form.checkValidity()) {

// Форма не прошла валидацию - отменить отправку
e.preventDefault();
e.stopImmediatePropagation();

}

};

3. Валидация отдельных полей

Отдельные поля имеют следующие свойства и методы проверки ограничений:

  • willValidate — Возвращает true, если элемент является кандидатом на участие в валидации.

  • validationMessage Сообщение проверки — пустая строка, если поле прошло валидацию.

  • validityValidityState объект с проверенным свойство установленным в true или false. Не прошедшие валидацию поля содержат одно или несколько из следующих свойств со значением true:

  • setCustomValidity() — Устанавливает сообщение об ошибке для недопустимого поля. Установите пустою строку для валидного значения или оно останется не валидным навсегда.

  • checkValidity() — Возвращает true, если значение input проходит валидацию. Оно похоже на validity. Если значение не валидно вызывается событие invalid event.

Функция-обработчик validateForm() может пройтись по всем полям формы и применить класс invalid к его родительскому элементу.

function validateForm(e) {

const
form = e.target,
field = Array.from(form.elements);

// применяем/удаляем класс invalid
field.forEach(i => {
if (i.checkValidity()) {
// поле валидно - удаляем класс
i.parentElement.classList.remove('invalid');
}
else {
// поле не валидно -- добавляем класс
i.parentElement.classList.add('invalid');
}
});

if (!form.checkValidity()) {
// форма не прошла валидацию - отменяем отправку
e.preventDefault();
e.stopImmediatePropagation();
}
};

Если вы определили обязательное поле email в вашей html5 форме:

<div>
<label for="email">email</label>
<input type="email" id="email" name="email" required />
<p class="help">Please enter a valid email address.</p>
</div>

Этот скрипт добавит класс invalid к контейнеру <div>, когда значение поля email не проходит валидацию. CSS может изменить стиль и показать или скрыть сообщение об ошибке:

.help { display: none; }

.invalid .help { display: block; }

.invalid label, .invalid input, .invalid .help {
color: red;
border-color: red;
}

4. Добавление проверки пользовательского поля

В этой демонстрации на CodePen показан пример контактной формы с полями имени (обязательное поле), электронной почты и телефона. Валидация происходит при отправке, и форма считается валидной когда имя, адрес электронной почты и/или телефон содержат допустимые значения.

Функция validateForm():

  • сбрасывает сообщение валидации и родительский стиль ошибки для каждого поля

  • передаёт не пустую строку методу .setCustomValidity() поле электронной почты и телефона, если они не определены и,

  • применяет класс invalid к родительскому элементу всех недопустимых полей.

// проверка формы
function validateForm(e) {

const
form = e.target,
field = Array.from(form.elements);

// сброс полей
field.forEach(i => {
i.setCustomValidity('');
i.parentElement.classList.remove('invalid');
});

// email или телефон заданы?
const err = form.email.value || form.tel.value ? '' : 'error';
form.email.setCustomValidity(err);
form.tel.setCustomValidity(err);

if (!form.checkValidity()) {

// форма не прошла валидацию - отмена отправки
e.preventDefault();
e.stopImmediatePropagation();

// добавляем класс invalid
field.forEach(i => {
if (!i.checkValidity()) {
// поле не прошло валидацию - добавляем класс
i.parentElement.classList.add('invalid');
}
});
}
}

Резюме

Валидация формы может быть обыденной, но это необходимая деятельность веб-разработчика. Время написания собственных регулярных выражения для электронной почты и проверки введённых чисел давно прошло. Используйте стандартные типы input, а затем, при необходимости проверяйте их с Constraint Validation API.

Никогда не забывайте проверять пользовательские данные на сервере!

Веб-формы стали неотъемлемой частью веб-приложений. Они часто используется для сбора такой информации о пользователе, как имя, адрес электронной почты, местоположение, возраст и т. д. Но вполне возможно, что какой-то пользователь может ввести данные не в том формате, в котором вы ожидаете.

Чтобы сэкономить время и избежать ненужной нагрузки на ресурсы вашего сервера, вы можете проверить данные формы на стороне клиента (то есть в системе пользователя), используя JavaScript, прежде чем передавать их на веб-сервер для дальнейшей обработки.

Проверка на стороне клиента также полезна для создания лучшего пользовательского взаимодействия; она быстрее, потому что проверка происходит в веб-браузере пользователя, тогда как проверка на стороне сервера происходит на сервере, который требует, чтобы вводимые пользователем данные были сначала отправлены на сервер, где происходит обработка; пользователь также должен дождаться ответа сервера, чтобы узнать, что именно пошло не так.

В этом разделе мы более подробно рассмотрим, как выполнять валидацию форм на JavaScript и обрабатывать любые ошибки ввода.

Проверка на стороне клиента не является заменой или альтернативой проверке на стороне сервера. Вы должны всегда проверять данные формы на стороне сервера, даже если они уже проверены на стороне клиента, потому что пользователь может отключить JavaScript в своем браузере.

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

Что ж, давайте посмотрим как это работает.

Создание HTML-формы

Давайте сначала создадим простую HTML-форму, которую мы будем проверять на стороне клиента, используя JavaScript, когда пользователь нажимает кнопку отправки (submit). Для этого создадим HTML-файл с именем application-form.html и поместим в него следующий код, а затем сохраним его где-нибудь в вашей системе.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple HTML Form</title>
    <link rel="stylesheet" href="style.css">
    <script src="validator.js"></script>
</head>
<body>
<form name="contactForm" onsubmit="return validateForm()" action="confirmation.php" method="post">
    <h2>Форма заявки</h2>
    <div class="row">
        <label>Имя</label>
        <input type="text" name="name">
        <div class="error" id="nameErr"></div>
    </div>
    <div class="row">
        <label>Email</label>
        <input type="text" name="email">
        <div class="error" id="emailErr"></div>
    </div>
    <div class="row">
        <label>Номер телефона</label>
        <input type="text" name="mobile" maxlength="10">
        <div class="error" id="mobileErr"></div>
    </div>
    <div class="row">
        <label>Страна</label>
        <select name="country">
            <option>Select</option>
            <option>Australia</option>
            <option>India</option>
            <option>United States</option>
            <option>United Kingdom</option>
        </select> 
        <div class="error" id="countryErr"></div>
    </div>
    <div class="row">
        <label>Пол</label>
        <div class="form-inline">
            <label><input type="radio" name="gender" value="male">Мужской</label>
            <label><input type="radio" name="gender" value="female">Женский</label> 
        </div>
        <div class="error" id="genderErr"></div>
    </div>
    <div class="row">
        <label>Хобби <i>(не обязательно)</i></label>
        <div class="form-inline">
            <label><input type="checkbox" name="hobbies[]" value="sports">Спорт</label>
            <label><input type="checkbox" name="hobbies[]" value="movies">Кино</label>
            <label><input type="checkbox" name="hobbies[]" value="music">Музыка</label>  
        </div>
    </div>        
    <div class="row">
        <input type="submit" value="Submit">
    </div>
</form>
</body>
</html>

Создание скрипта валидации формы

Теперь мы собираемся создать файл JavaScript, который содержит наш полный скрипт проверки.

Что ж, давайте создадим файл JavaScript с именем validator.js и поместим в него следующий код, а затем сохраним его в том же месте, где вы сохранили предыдущий HTML-файл. Просмотрите каждую строку следующего примера кода, чтобы понять, как работает проверка JavaScript:

// Определяем функции для отображения сообщения об ошибке
function printError(elemId, hintMsg) {
    document.getElementById(elemId).innerHTML = hintMsg;
}

// Определяем функции для проверки формы
function validateForm() {
    // Получение значений элементов формы
    var name = document.contactForm.name.value;
    var email = document.contactForm.email.value;
    var mobile = document.contactForm.mobile.value;
    var country = document.contactForm.country.value;
    var gender = document.contactForm.gender.value;
    var hobbies = [];
    var checkboxes = document.getElementsByName("hobbies[]");
    for(var i=0; i < checkboxes.length; i++) {
        if(checkboxes[i].checked) {
            // Заполняем массив хобби выбранными значениями
            hobbies.push(checkboxes[i].value);
        }
    }
    
    // Определяем переменные ошибок со значением по умолчанию
    var nameErr = emailErr = mobileErr = countryErr = genderErr = true;
    
    // Проверяем имя
    if(name == "") {
        printError("nameErr", "Пожалуйста, введите ваше имя");
    } else {
        var regex = /^[a-zA-Zs]+$/;                
        if(regex.test(name) === false) {
            printError("nameErr", "Пожалуйста, введите правильное имя");
        } else {
            printError("nameErr", "");
            nameErr = false;
        }
    }
    
    // Проверяем адрес электронной почты
    if(email == "") {
        printError("emailErr", "Пожалуйста, введите адрес вашей электронной почты");
    } else {
        // Регулярное выражение для базовой проверки электронной почты
        var regex = /^S+@S+.S+$/;
        if(regex.test(email) === false) {
            printError("emailErr", "Пожалуйста, введите действительный адрес электронной почты");
        } else{
            printError("emailErr", "");
            emailErr = false;
        }
    }
    
    // Проверяем номер мобильного телефона
    if(mobile == "") {
        printError("mobileErr", "Пожалуйста, введите номер вашего мобильного телефона");
    } else {
        var regex = /^[1-9]d{9}$/;
        if(regex.test(mobile) === false) {
            printError("mobileErr", "Пожалуйста, введите действительный 10-значный номер мобильного телефона");
        } else{
            printError("mobileErr", "");
            mobileErr = false;
        }
    }
    
    // Проверяем страну
    if(country == "Select") {
        printError("countryErr", "Пожалуйста, выберите вашу страну");
    } else {
        printError("countryErr", "");
        countryErr = false;
    }
    
    // Проверяем пол
    if(gender == "") {
        printError("genderErr", "Пожалуйста, выберите ваш пол");
    } else {
        printError("genderErr", "");
        genderErr = false;
    }
    
    // Запрещаем отправку формы в случае ошибок
    if((nameErr || emailErr || mobileErr || countryErr || genderErr) == true) {
       return false;
    } else {
        // Создаем строки из входных данных для предварительного просмотра
        var dataPreview = "Вы ввели следующие данные: n" +
                          "Имя: " + name + "n" +
                          "Email: " + email + "n" +
                          "Номер: " + mobile + "n" +
                          "Страна: " + country + "n" +
                          "Пол: " + gender + "n";
        if(hobbies.length) {
            dataPreview += "Hobbies: " + hobbies.join(", ");
        }
        // Отображаем входные данные в диалоговом окне перед отправкой формы
        alert(dataPreview);
    }
};

Доступ к значению отдельного поля формы можно получить с помощью синтаксиса document.formName.fieldName.value или document.getElementsByName(name).value. Но, чтобы получить значения из поля формы, которое поддерживает множественный выбор, например, группу чекбоксов, вам нужно использовать оператор цикла, как показано в примере выше (строки с 14 по 21).

Чтобы проверить, является ли формат входных данных правильным или нет, мы должны использовать регулярные выражения. Это один из наиболее эффективных методов проверки пользовательских данных.

Вышеприведенный скрипт также отображает данные, введенные пользователем в диалоговом окне для предварительного просмотра перед отправкой формы на веб-сервер.

Вы можете проверить формат электронной почты с помощью регулярного выражения. Но пользователь может ввести адрес электронной почты, который правильно отформатирован, но не существует. Поэтому для проверки подлинности электронной почты отправьте пользователю электронное письмо с подтверждением и убедитесь, что электронное письмо действительно существует.

Добавление стилей для формы

Наконец, создайте файл с именем style.css и поместите в него следующий код, затем сохраните его также в том же месте, где вы сохранили два предыдущих файла. Это правила для визуального оформления нашей формы.

body {
    font-size: 16px;
    background: #f9f9f9;
    font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
}
h2 {
    text-align: center;
    text-decoration: underline;
}
form {
    width: 300px;
    background: #fff;
    padding: 15px 40px 40px;
    border: 1px solid #ccc;
    margin: 50px auto 0;
    border-radius: 5px;
}
label {
    display: block;
    margin-bottom: 5px
}
label i {
    color: #999;
    font-size: 80%;
}
input, select {
    border: 1px solid #ccc;
    padding: 10px;
    display: block;
    width: 100%;
    box-sizing: border-box;
    border-radius: 2px;
}
.row {
    padding-bottom: 10px;
}
.form-inline {
    border: 1px solid #ccc;
    padding: 8px 10px 4px;
    border-radius: 2px;
}
.form-inline label, .form-inline input {
    display: inline-block;
    width: auto;
    padding-right: 15px;
}
.error {
    color: red;
    font-size: 90%;
}
input[type="submit"] {
    font-size: 110%;
    font-weight: 100;
    background: #006dcc;
    border-color: #016BC1;
    box-shadow: 0 3px 0 #0165b6;
    color: #fff;
    margin-top: 10px;
    cursor: pointer;
}
input[type="submit"]:hover {
    background: #0165b6;
}

Теперь откройте файл application-form.html в веб-браузере и попробуйте заполнить некоторые данные и посмотреть, как скрипт реагирует на ввод недопустимых данных в поле формы.

Чтобы узнать о проверке на стороне сервера, ознакомьтесь с Руководством по валидации форм в PHP.

Это тоже интересно:

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

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии