Те, кто занимается созданием сайтов, в какой-то момент сталкиваются с необходимостью проверки заполнения пользователем полей формы, размещённой на сайте. Для этого создаётся какой-то вариант проверки пустых полей, который используется в своих проектах. Но для каждого случая количество полей, которые необходимо проверить, может быть разным. Это приводит к тому, что созданный вариант проверки необходимо изменять в зависимости от конкретных условий, и в дальнейшем у нас появляется уже несколько его модификаций.
Кроме того, на одной странице сайта может размещаться несколько форм, у каждой из которых будет разное количество обязательных для заполнения полей. В результате код будет включать в себя несколько блоков с одинаковыми функциями, но разными условиями, что не всегда является правильным решением.
В своей практике мне тоже приходилось использовать разные варианты проверки заполнения полей формы в зависимости от конкретных условий. И в файле *.js присутствовало несколько функций для проверки разных форм, что увеличивало объём кода и ухудшало его восприятие.
В какой-то момент было принято решение написать вариант универсального способа проверки пустых полей, который можно будет использовать для любой формы с любым количеством обязательных полей. Необходимыми условиями такого способа были определены простота и отсутствие громоздких конструкций. В результате был найден способ, который полностью меня устроил и простотой, и универсальностью.
Суть этого способа:
В html-разметке для обязательных полей добавляется data-атрибут, который является маркером обязательности.
Проверка выполняется только для тех полей, у которых присутствует данный атрибут.
Возможность расширения функционала проверкой значения, указанного пользователем в поле.
Пример разметки формы:
Заголовок формы #1
Обязательно для заполнения
Обязательно для заполнения
Пример кода проверки полей:
$(".js-form-validate").submit(function () {
var form = $(this);
var field = ;
form.find("input").each(function () {
field.push("input");
var value = $(this).val(),
line = $(this).closest(".some-form__line");
for(var i=0;i
Шаг 2 - создаем форму, разделенную на три части
Мы создадим форму, состоящую из трех частей, чтобы увидеть как проводить валидацию разных полей ввода и чекеров. Для разделения мы используем FIELDSET и LABEL, для заголовков каждого раздела:
Персональная информация (имя пользователя, день рождения, пол, транспортное средство).
Email (поле ввода email пользователя).
О себе (краткая информация о пользователе).
Real-Time Form Validation Using jQuery
Personal Info
Email
About You
Шаг 3 - добавляем поля и кнопку подтвердить
Отлично, теперь создадим несколько полей ввода для нашей формы. Для нашего урока, мы специально отобрали несколько разных полей:
- Три поля INPUT (имя пользователя, дата рождения, email адресс).
- RADIO кнопки, для выбора пола.
- CHECKBOX для транспортных средств пользователя.
- TEXTAREA для информации о пользователе.
- BUTTON для кнопки «Подтвердить».
Мы будем обвертывать каждый LABLE и поле ввода в тег P, чтобы разделить на отдельные блоки. Теперь ваш финальный файл index.html будет выглядеть следующим образом:
Real-Time Form Validation Using jQuery
Personal Info
Full name:
Day of birth (dd-mm-yyyy):
I am:
Man
Woman
I own:
car
airplane
bicycle
ship
Email
Email ([email protected]):
About You
Tell us a little bit about yourself:
submit
Это может выглядеть немного страшновато, но это потому что много полей ввода в нашей форме. На самом деле, здесь нет ничего сложного. Сохраните ваш файл, и посмотрите в браузере, что получилось. Теперь немного украсим…
Добавляем CSS
Так как CSS стилизирование не основная тема сегодняшнего урока, мы не будем на этом останавливаться. Просто нам необходим этот CSS код, чтобы форма выглядела красиво и все блоки были на своих местах.
Создайте файл style.css, вставьте в него код ниже. Теперь форма с будущей jquery валидацией, выглядит потрясающе. Не так ли?
Body {
background: #efefef;
margin: 0;
padding: 0;
border: none;
text-align: center;
font: normal 13px Georgia, "Times New Roman", Times, serif;
color: #222;
}
#content {
width: 500px;
margin: 0 auto;
margin-bottom: 25px;
padding: 0;
text-align: left;
}
fieldset {
margin-top: 25px;
padding: 15px;
border: 1px solid #d1d1d1;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
border-radius: 7px;
}
fieldset legend {
font: normal 30px Verdana, Arial, Helvetica, sans-serif;
text-shadow: 0 1px 1px #fff;
letter-spacing: -1px;
color: #273953;
}
input, textarea {
padding: 3px;
}
label {
cursor: pointer;
}
.block {
display: block;
}
small {
letter-spacing: 1px;
font-size: 11px;
font-style: italic;
color: #9e9e9e;
}
.info {
text-align: left;
padding: 5px;
font-size: 11px;
color: #fff;
position: absolute;
display: none;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: -1px 1px 2px #a9a9a9;
-moz-box-shadow: -1px 1px 2px #a9a9a9;
box-shadow: -1px 1px 2px #a9a9a9;
}
.error {
background: #f60000;
border: 3px solid #d50000;
}
.correct {
background: #56d800;
border: 3px solid #008000;
}
.wrong {
font-weight: bold;
color: #e90000;
}
.normal {
font-weight: normal;
color: #222;
}
#send {
background: #3f5a81;
width: 100%;
border: 5px solid #0F1620;
font: bold 30px Verdana, sans-serif;
color: #fafafa;
text-shadow: 1px 1px 1px #0F1620;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
border-radius: 7px;
}
#send:hover {
background: #4d76b1;
border: 5px solid #253750;
color: #fff;
}
#send:active {
text-indent: -10px;
}
Пишем jQuery валидацию формы
Это наиболее интересная и увлекательная часть урока. Но для начала, нам необходимо подумать и описать основные моменты нашей работы. Нужно все спланировать.
Планируем
Перед тем как будем писать, задайте себе три вопроса:
Что нам нужно от этого скрипта?
Как мы хотим это сделать?
Как мы этого добьемся?
Это понятно, мы хотим, чтобы скрипт проводил валидацию формы. Но как? Мы хотим, чтобы он делал это в режиме реального времени (когда пользователь завершит заполнение поля ввода) и при нажатии на кнопку «Подтвердить». Поэтому нам придется написать несколько функций: отдельно для каждого поля ввода и для всех форм (которая вызовется при нажатии кнопки «Подтвердить»).
Чтобы предотвратить повторение кода, нам нужно будет создать JavaScript объект для этого.
Что нам для этого нужно?
JS объект в нашем случае будет называться jVal
, он будет содержать следующие методы:
- jVal.fullName
- jVal.birthDate
- jVal.gender
- jVal.vehicle
- jVal.email
- jVal.about
Переменная, которая будет содержать статус текущей ошибки - jVal.errors. И метод, который проверяет, существуют ли какие-то ошибки и подтверждает отправку формы или отклоняет. Если нашлись какие-то ошибки, направляет пользователя в начало формы, где он может заполнить все поля корректно.
Метод называется - jVal.sendIt
Теперь, мы можем приступить к разработке jQuery скрипта валидации форм. Когда мы напишем первый метод, далее все пойдет проще и быстрее.
Начинаем работу
Основа кода проста, абсолютно весь jquery код будет содержаться внутри этого синтаксиса:
$(document).ready(function(){
jVal = {
};
});
Валидация поля имени пользователя
Наш первый метод будет обрабатывать поле «имя пользователя». Вставьте его внутрь jVal объекта, как показано на примере:
Var jVal = {
"fullName" : function() {
}
};
Теперь напишем несколько строк кода внутри метода. Просто вставьте их, далее мы рассмотрим что это значит:
$("body").append("");
var nameInfo = $("#nameInfo");
var ele = $("#fullname");
var pos = ele.offset();
Линия 1:
Мы добавляем DIV блок в документ. Class info, придает некий стиль для блока, который определен в файле style.css, также делает его невидимым с помощью display:none; Нащет ID, это для того, чтобы иметь быстрый доступ к этому блоку и манипулировать ним с помощью jQuery. Этот DIV блок будет содержать информацию о валидации поля.
Линия 3:
Пишем обращение к этому блоку в переменную, так как мы будем использовать его большое количество раз.
Линия 4:
Так же как и в предыдущем случае, мы записываем подключение к полю fullname в переменную. Мы также будем использовать его много раз.
jQuery функция offset() возвращает текущую позицию элемента по отношению к документу. Возвращается в виде объекта, который содержит свойства top и left. Мы используем эту функцию для ele, чтобы определить позицию поля ввода.
Теперь допишем еще несколько строк…
NameInfo.css({
top: pos.top-3,
left: pos.left+ele.width()+15
});
Как видите, мы начинаем оперировать со стилями блока nameInfo. Конкретно, мы устанавливаем его позицию справа от поля ввода. Для этого, мы подымаем на 3 пикселя вверх (2 строка кода), и двигаем на 15 пикселей справа от поля (3 строка кода).
Мы написали 50% первого метода, доведем дело до конца. Настало время определить, насколько корректно пользователь ввел данные и предпринять меры…
If(ele.val().length < 6) {
jVal.errors = true;
nameInfo.removeClass("correct").addClass("error").html("← at least 6 characters").show();
ele.removeClass("normal").addClass("wrong");
} else {
nameInfo.removeClass("error").addClass("correct").html("√").show();
ele.removeClass("wrong").addClass("normal");
}
Выглядит не очень? Бояться нечего…
Линия 1:
Проверяем, чтобы имя введенное пользователем не было менее 6 символов.
Линия 2:
Устанавливаем переменную jVal.errors на true, так как мы определили, что имя пользователя слишком короткое. Мы будем использовать это далее.
Линия 3:
Мы начинаем оперировать нашим nameInfo элементом (в котором выводим информацию). Для начала мы удаляем class correct, и присваиваем class error. Далее мы вставляем контент в nameInfo элемент, это информация о том, что имя должно быть длиннее 6 символов. И наконец то, мы делаем видимым наше сообщение для пользователя.
Линия 4:
Мы начинаем оперировать нашим ele элементом (форма ввода имени пользователя). Удаляем класс normal и присваиваем wrong.
Линия 5:
Если имя пользователя достаточно длинное, тогда…
Линия 6:
Мы начинаем оперировать nameInfo элементом. Если присвоен класс error, удаляем его и присваиваем класс correct. Вставляем внутрь «птичку», чтобы понять что все ОК. И показываем сообщение для пользователя.
Линия 7:
Оперируем ele элементом. Удаляем класс wrong, если он применен, и применяем класс normal.
Мы создали наш первый метод валидации! Пришло время протестировать его. Мы должны быть уверены, что наш метод вызовется, когда пользователь закончит вводить свое имя. Для реализации этого, нам необходимо прицепить событие к действию. Мы будем использовать функцию change(). Вставьте пример кода ниже, под jVal объектом:
$("#fullname").change(jVal.fullName);
Что это значит на человеческом языке: если пользователь изменяет значение поля «Full name» а потом заканчивает с этим, вызывается метод fullName, который проводит валидацию поля.
Теперь ваш файл validate.js должен содержать следующий код:
< 6) {
jVal.errors = true;
nameInfo.removeClass("correct").addClass("error").html("← at least 6 characters").show();
ele.removeClass("normal").addClass("wrong");
} else {
nameInfo.removeClass("error").addClass("correct").html("√").show();
ele.removeClass("wrong").addClass("normal");
}
}
};
// bind jVal.fullName function to "Full name" form field
$("#fullname").change(jVal.fullName);
});
Валидация поля даты рождения
Теперь все пойдет быстрее. Нам просто нужно сделать копию fullName метода и внести некоторые изменения.
Теперь, скопируйте fullName метод, вставьте его ниже и переименуйте в birthdate. И сделайте следующие изменения:
- Всюду где встречается nameInfo, замените на birthInfo
- Вместо #fullname, используйте #birthday для переменной ele
- Вставьте этот шаблон регулярного выражения ниже выражения birthInfo.css():
var patt = /^{2}\-{2}\-{4}$/i;
- Наше прежнее if() выражения должно быть:
if(!patt.test(ele.val()))
- Сообщение к этому полю будет следующее: type in date in correct format
Вот как должен выглядеть birthdate метод, после внесения этих изменений:
"birthDate" : function (){
$("body").append("");
var birthInfo = $("#birthInfo");
var ele = $("#birthday");
var pos = ele.offset();
birthInfo.css({
top: pos.top-3,
left: pos.left+ele.width()+15
});
var patt = /^{2}\-{2}\-{4}$/i;
if(!patt.test(ele.val())) {
jVal.errors = true;
birthInfo.removeClass("correct").addClass("error").html("← type in date in correct format").show();
ele.removeClass("normal").addClass("wrong");
} else {
birthInfo.removeClass("error").addClass("correct").html("√").show();
ele.removeClass("wrong").addClass("normal");
}
}
С помощью регулярного выражения (14 строка), мы проверяем, чтобы дата была в формате 28-03-1987. В 16 строке, мы проверяем соответствие даты рождения пользователя с шаблоном регулярного выражения.
И конечно же, нам нужно прикрепить событие change() для поля даты рождения:
$("#birthday").change(jVal.birthDate);
Теперь мы имеем еще один работающий метод валидации формы на jQuery. Отличная работа!
Валидация поля стать
Опять скопируйте метод fullName, переименуйте его в gender и внесите следующие изменения:
- Все nameInfo переименуйте в genderInfo
- Вместо #fullname, примените #woman для переменной ele
- В выражении genderInfo.css(), переменную top измените на top: pos.top-10, и left на left: pos.left+ele.width()+60
- Наше выражение if() должно быть:
if($("input:checked").length === 0)
- Сообщение пользователю будет: are you a man or a woman?
Вот как должен выглядеть метод gender, после изменений:
"gender" : function (){
$("body").append("");
var genderInfo = $("#genderInfo");
var ele = $("#woman");
var pos = ele.offset();
genderInfo.css({
top: pos.top-10,
left: pos.left+ele.width()+60
});
if($("input:checked").length === 0) {
jVal.errors = true;
genderInfo.removeClass("correct").addClass("error").html("← are you a man or a woman?").show();
ele.removeClass("normal").addClass("wrong");
} else {
genderInfo..removeClass("error").addClass("correct").html("√").show();
ele.removeClass("wrong").addClass("normal");
}
}
В строке 14 мы проверяем сколько выбрано селекторов radio. Если 0, то пользователь ничего не выбрал, выводим сообщение об ошибке.
И как всегда, прикрепляем gender метод для radio кнопок:
$("input").change(jVal.gender);
Валидация checkers - владение транспортом
Теперь скопируем gender методи и переименуем его в vehicle, внесем следующие изменения:
- Все genderInfo замените на vehicleInfo
- Вместо #woman, впишите #ship для ele.
- В vehicleInfo.css() выражении, значение left должно быть left: pos.left+ele.width()+40
- Наше выражение if() должно теперь быть:
if($("input:checked").length