Валидация формы на jQuery
В сегодняшней статье мы будем с Вами создавать скрипт валидации формы с помощью javascript-библиотеки jQuery.
Валидация - это попросту говоря, проверка введенных пользователем данных в форму на соответствие тем или иным параметрам.
Допустим, если у нас есть поле, куда должен быть введен email, мы должны обязательно проверить, чтобы пользователь ввел именно email-адрес, а не набор каких-то непонятных символов.
В данном уроке будет рассмотрен jQuery-скрипт для валидации формы обратной связи и отправкой данных с помощью Ajax-запроса.
Создадим HTML структуру нашей формы:
<div id="feedback-box">
<h2>Связь со мной</h2>
<form id="feedback-form">
<div class="input-bloc w1">
<label for="name">Имя:</label>
<input type="text" size="25" name="name" id="name" />
<div class="error-box"></div> <!-- Контейнер для ошибок -->
</div>
<div class="input-bloc w1">
<label for="email">Email:</label>
<input type="text" size="25" name="email" id="email" />
<div class="error-box"></div>
</div>
<div class="input-bloc msg">
<label for="message">Сообщение:</label>
<textarea name="message" cols="50" rows="10" id="message"></textarea>
<div class="error-box"></div>
</div>
<div><input type="submit" id="send" value="Отправить письмо" /></div>
</form>
</div>
Далее пропишем CSS стили для нашей формы:
*{ margin:0; padding: 0;} //убираем все отступы по умолчанию
body{ font: 13px Arial, sans-serif; }
#feedback-box{
background: url(http://subtlepatterns.com/patterns/paper_fibers.png);
width: 400px;
margin: 20px auto;
border: 1px solid #ccc;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
#feedback-box h2{
text-align: center;
height: 40px;
line-height: 40px;
border-bottom: 1px solid #ddd;
font-size: 23px;
color: #414141;
margin: 0;
}
#feedback-form{
padding: 20px 25px;
border-top: 1px solid #fff;
}
#feedback-form input[type="text"], #feedback-form textarea{
padding: 7px 10px;
outline: none;
border: 1px solid #ddd;
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
}
#feedback-form textarea{
resize: none;
overflow-y: auto;
width: 330px;
}
#feedback-form input[type="text"]{
margin-left: 10px;
}
#feedback-form input[type="text"]:focus, #feedback-form textarea:focus{
border: 1px solid #ccc;
}
#feedback-form #send{
padding: 5px 20px;
}
#feedback-form .input-bloc{
margin-bottom: 12px;
}
#feedback-form .w1 label{
display: inline-block;
width: 40px;
}
#feedback-form .msg label{
display: inline-block;
margin-bottom: 6px;
}
.error-box{
color: red;
font-size: 12px;
}
Теперь наша форма выглядит так:
После того, как форма готова, приступаем к написанию кода для валидации:
Логика работы будет следующая: когда пользователь убирает курсор с поля (поле теряет фокус), оно проходит определенную проверку.
Если все введено согласно параметрам верно, тогда полю присваивается класс "not_error". Иначе, если поле не прошло проверку на правильность введенных данных, оно получает класс "error".
Присваивание классов - также важный момент в реализации данного подхода валидации. Именно они позволят нам проверить, будет ли доступна функции отправки формы или нет при нажатии на кнопку ее отправки.
<script type="text/javascript">
$(document).ready(function(){
// Устанавливаем обработчик потери фокуса для всех полей ввода текста
$('input#name, input#email, textarea#message').unbind().blur( function(){
// Для удобства записываем обращения к атрибуту и значению каждого поля в переменные
var id = $(this).attr('id');
var val = $(this).val();
// После того, как поле потеряло фокус, перебираем значения id, совпадающие с id данного поля
switch(id)
{
// Проверка поля "Имя"
case 'name':
var rv_name = /^[a-zA-Zа-яА-Я]+$/; // используем регулярное выражение
// Eсли длина имени больше 2 символов, оно не пустое и удовлетворяет рег. выражению,
// то добавляем этому полю класс .not_error,
// и ниже в контейнер для ошибок выводим слово " Принято", т.е. валидация для этого поля пройдена успешно
if(val.length > 2 && val != '' && rv_name.test(val))
{
$(this).addClass('not_error');
$(this).next('.error-box').text('Принято')
.css('color','green')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
// Иначе, мы удаляем класс not-error и заменяем его на класс error, говоря о том что поле содержит ошибку валидации,
// и ниже в наш контейнер выводим сообщение об ошибке и параметры для верной валидации
else
{
$(this).removeClass('not_error').addClass('error');
$(this).next('.error-box').html('поле "Имя" обязательно для заполнения<br>, длина имени должна составлять не менее 2 символов<br>, поле должно содержать только русские или латинские буквы')
.css('color','red')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
break;
// Проверка email
case 'email':
var rv_email = /^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
if(val != '' && rv_email.test(val))
{
$(this).addClass('not_error');
$(this).next('.error-box').text('Принято')
.css('color','green')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
else
{
$(this).removeClass('not_error').addClass('error');
$(this).next('.error-box').html('поле "Email" обязательно для заполнения<br>, поле должно содержать правильный email-адрес<br>
.css('color','red')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
break;
// Проверка поля "Сообщение"
case 'message':
if(val != '' && val.length < 5000)
{
$(this).addClass('not_error');
$(this).next('.error-box').text('Принято').
.css('color','green')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
else
{
$(this).removeClass('not_error').addClass('error');
$(this).next('.error-box').html('поле "Текст письма" обязательно для заполнения')
.css('color','red')
.animate({'paddingLeft':'10px'},400)
.animate({'paddingLeft':'5px'},400);
}
break;
} // end switch(...)
}); // end blur()
// Теперь отправим наше письмо с помощью AJAX
$('form#feedback-form').submit(function(e){
// Запрещаем стандартное поведение для кнопки submit
e.preventDefault();
// После того, как мы нажали кнопку "Отправить", делаем проверку,
// если кол-во полей с классом .not_error равно 3 (так как у нас всего 3 поля), то есть все поля заполнены верно,
// выполняем наш Ajax сценарий и отправляем письмо адресату
if($('.not_error').length == 3)
{
// Eще одним моментом является то, что в качестве указания данных для передачи обработчику send.php, мы обращаемся $(this) к нашей форме,
// и вызываем метод .serialize().
// Это очень удобно, т.к. он сразу возвращает сгенерированную строку с именами и значениями выбранных элементов формы.
$.ajax({
url: 'send.php',
type: 'post',
data: $(this).serialize(),
beforeSend: function(xhr, textStatus){
$('form#feedback-form :input').attr('disabled','disabled');
},
success: function(response){
$('form#feedback-form :input').removeAttr('disabled');
$('form#feedback-form :text, textarea').val('').removeClass().next('.error-box').text('');
alert(response);
}
}); // end ajax({...})
}
// Иначе, если количество полей с данным классом не равно значению 3, мы возвращаем false,
// останавливая отправку сообщения в невалидной форме
else
{
return false;
}
}); // end submit()
}); // end script
</script>
В самом начале задаем условие, что когда DOM загружена, мы включаем скрипт в работу.
$('input#name, input#email, textarea#message').unbind().blur( function(){ ... });
В набор объектов на проверку мы включаем все необходимые поля нашей формы. В качестве уникальных значений каждому из объектов формы задаем свой идентификатор. Устанавливаем событие потери фокуса blur на каждый объект из набора.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Когда поле потеряло фокус, сработал метод blur, конструкцией switch-case поверяется, какое именно поле это было. Для определения мы как раз и будем использовать те самые идентификаторы полей.
var id = $(this).attr('id');
var val = $(this).val();
switch(id) {
case 'name'
....
break;
}
Для удобства в переменные id и val мы поместили значение идентификатора поля, которое потеряло фокус а так же его значение.
В блоке case мы уже осуществляем проверку текущего поля на те параметры, которые нам необходимы. К примеру, в моем примере я проверяю поле имени регулярным выражением и также на длину введенного в него значения.
Если введенное пользователем значение проходит проверку, тогда я добавляю полю нужный класс (о них я говорил выше) и визуализирую его нужными мне эффектами - тут работает уже только Ваша фантазия.
Такая же схема работы со всеми объектами формы.
Пользователь заполнил все поля, допустим верно, и нажимает на кнопку отправки данной формы:
$('form#feedback-form').submit(function(e){
// Запрещаем стандартное поведение для кнопки submit
e.preventDefault();
if($('.not_error').length == 3)
{
// Ajax запрос на отправку формы
}
Сначала мы запрещаем стандартное поведение при нажатии на кнопку Submit. И самое главное - в блоке if мы проверяем количество элементов с классом not_error.
Напомню, данный класс мы добавляли ко всем полям без ошибок. Так как количество проверяемых объектов нашей формы было всего 3, то мы проверяем количество элементов с данным классом. Если условие срабатывает, тогда мы просто составляем AJAX-запрос на отправку данных формы в PHP-обработчик.
Если количество полей с данным классом не будет равно необходимому нам количеству, форма не отправится. Т.е. чтобы отправить форму, поля в любом случае должны получить фокус и получить правильное значение. Иначе скрипт возвратит FALSE (ложь) при отправке.
Обработчик send.php
$email = $_POST['email']; $name = $_POST['name']; $message = $_POST['message']; $to = "admin@mail.ru"; $subject = "От посетителя сайта"; $text = "Написал(а): $name\n Контактный email - $email\n\n Текст письма: $message\n"; $header.= "Content-type: text/html; charset=utf-8\r\n"; $header .= "MIME-Version: 1.0\r\n"; $sending = mail($to, $subject, $text, $headers); if($sending) echo "Письмо отправлено. Ответа не ждите :)";
На этом все. Надеюсь, данный материал будет для вас хорошей основой для собственных решений.
Материал подготовил Сергей Губарев специально для сайта CodeHarmony.ru
P.S. Присмотритесь к премиум-урокам по различным аспектам сайтостроения, включая JavaScript, jQuery и Ajax, а также к бесплатному курсу по созданию своей CMS-системы на PHP с нуля. Все это поможет вам быстрее и проще освоить практические навыки веб-программирования:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:
|
PHP: Получение информации об объекте или классе, методах, свойствах и наследовании |
|
|
Функции обратного вызова, анонимные функции и механизм замыканий |
|
|
Применение функции к каждому элементу массива Сервис онлайн-записи на собственном Telegram-боте
Попробуйте сервис онлайн-записи VisitTime на основе вашего собственного Telegram-бота:— Разгрузит мастера, специалиста или компанию; — Позволит гибко управлять расписанием и загрузкой; — Разошлет оповещения о новых услугах или акциях; — Позволит принять оплату на карту/кошелек/счет; — Позволит записываться на групповые и персональные посещения; — Поможет получить от клиента отзывы о визите к вам; — Включает в себя сервис чаевых. Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе |
|
|
Деструктор и копирование объектов с помощью метода __clone() |
|
|
Эволюция веб-разработчика или Почему фреймворк - это хорошо? |
|
|
Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.) |
|
|
50 классных сервисов, программ и сайтов для веб-разработчиков |



















