JS, JQuery: Универсальная валидация форм и полей ввода

Всем привет. Не смотря на свою 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% случаев всех необходимых валидаций, а значит способны сэкономить кучу времени Вам как разработчику.

Запись опубликована в рубрике JavaScript с метками , , , , , , , , , , , . Добавьте в закладки постоянную ссылку.