Всем привет. Не смотря на свою 110% загруженность я стараюсь пополнять свой блог новыми полезными заготовками! Сегодня я хочу привести пример удобного плагинчика, который поможет вам реализовать проверку полей форм на стороне клиента, т.е. в с помощью javascript.
Ни для кого не секрет, что любые формы на сайте нужно проверять. Нужно проверять как на стороне сервера (must have), так и на стороне клиента. Форм много, и добавлять проверки для каждого поля ввода достаточно противное занятие. Давайте попробуем обобщить данную задачу.
Если пораскинуть мозгами, то валидация форм как правило сводится к нескольким задачам:
1) Проверка обязательных полей.
2) Блокировка нежелательных ввода символов
3) Проверка введенного значения с желаемым результатом.
А что лучше всего подходит для проверки строк? Правильно — регулярные выражения, именно их мы и будет активно применять для решения поставленных задач!
Пункт 1, как правило, решается добавлением атрибута required к тегу формы (например <input required …>). Однако это приводит к появлению окна сообщения, реализованного на уровне браузера. Кому то это решение подходит, но как правило дизайнеры предлагают свое видение данных ошибок, а как следствие реализовывать валидацию обязательного заполнения стоит с помощью скриптов.
Для этого добавим следующий код.
$('[required]').each(function() {
$(this).prop('required', false).attr('data-required', 'true');
}).click(function() {
$(this).removeClass('error').parent().find('.error-message').text('');
});
Примечание: Код предполагает наличие библиотеки Jquery, а так же что все инпуты имеют некий родительский контейнер (как правило так оно и бывает в реальных проектах). Пример:
<div class="group">
<input required name="somename" />
</div>
Приведенный выше код автоматически удалит атрибут required у тегов и создаст вместо него атрибут data-required=»true».
Для решения второй задачи создадим следующий обработчик:
$('[data-regexp-input]').keypress(function(e) {
if(e.key || [46, 8, 37, 38, 39, 40].indexOf(e.keyCode) == -1) {
if(!new RegExp($(this).data('regexp-input'), "g").test(e.key)) {
e.preventDefault();
return false;
}
}
});
$('[data-regexp-block]').keypress(function(e) {
if(new RegExp($(this).data('regexp-block'), "g").test(e.key)) {
e.preventDefault();
return false;
}
});
Он позволит нам фильтровать вводимые символы как по разрешенным символам, так и по запрещенным. Теперь если мы захотим разрешить вводить в поле только цифры и пробелы, то там логичней воспользоваться обработчиком разрешенных символов:
<input type="text" data-regexp-input="[\d\s]" />
Если же мы хотим разрешить вводить все кроме символов (, ), !, ?, то логичней будет воспользоваться обработчиком блокирования символов:
<input type="text" data-regexp-block="[!\(\)\?]" />
Для решения третей задачи, нам понадобится вспомогательная функция.
function checkRegexp(o, e) {
var $this = $(o);
$this.removeClass('error');
$this.parent().find('span.error-message').text('');
if($this.data('regexp') && $this.data('regexp') != '') {
if($this.parent().find('span.error-message').length == 0) {
$this.parent().append('');
}
if($this.val() == '' && $this.data('required')) {
$this.addClass('error');
$this.parent().find('span.error-message').text('Обязательно к заполнению');
} else {
if(!new RegExp('^' + $this.data('regexp') + '$', 'g').test($this.val())) {
$this.addClass('error');
$this.parent().find('span.error-message').text('Заполненно некорректно');
}
}
}
$this.closest('form').find('[type="submit"]').prop('disabled', $this.closest('form').find('input.error').length != 0);
}
Данный код проверяет переданный объект «o» (это будет инпут) и в случае каких либо ошибок создает дополнительный блок span с сообщением об ошибке. Так же данная функция обрабатывает созданный в пункте 1 атрибут data-required.
Теперь необходимо повесить данную функцию на наши элементы
$('input[data-regexp]').click(function() {
$(this).removeClass('error');
}).keyup(function(e) {
checkRegexp(this, e);
}).blur(function(e) {
checkRegexp(this, e);
});
Теперь для проверки валидность поля на желаемый шаблон достаточно добавить тегу атрибут data-regexp, например проверка поля на формат даты в виде ГГГГ-ММ-ДД:
<input type="text" data-regexp="\d{4}\-\d{2}\-\d{2}" />
Вот собственно и все. Всего несколько строк кода, позволяют нам полностью перенести задачу валидации формы из скриптов в html файл путем добавления нужных атрибутов для элементов ввода. Описанные выше скрипты охватывают более 50% случаев всех необходимых валидаций, а значит способны сэкономить кучу времени Вам как разработчику.