Статьи

JavaScript: это не проверка!

Термин «проверка JavaScript» несколько вводит в заблуждение, поскольку описывает процесс оказания помощи пользователям в правильном заполнении форм. Фактически, внутренний код выполняет проверку — JavaScript просто предоставляет помощь. Но когда подтверждение и помощь не приходят из одного и того же источника, они лишь смущают людей.

Веб-формы — это средство, с помощью которого HTML стал интерактивным. Именно через формы веб-приложения получают информацию от конечных пользователей. Иногда этот поток информации может быть непринужденным, спокойным и неограниченным. В других случаях поток информации необходимо проверять, чтобы убедиться, что данные веб-формы имеют правильный формат, в частности, такие как адреса электронной почты, адреса доставки и номера кредитных карт. Мы все знаем, что ключом к хорошим данным является проверка на стороне сервера, и что проверка на стороне пользователя с использованием JavaScript помогает пользователю сделать все правильно, не дожидаясь обхода сервера. Разработчики уже объединили функциональность JavaScript с их внутренней проверкой. Однако большинство рассматривает эти формы проверки, как если бы они были одной и той же задачей, используя разные технологии.

Строго говоря, валидация JavaScript — это не проверка, а помощь при вводе. Любой может обойти JavaScript; это помощь, а не ворота. Это просто помогает придать вашим пользователям уверенность при нажатии на эту большую кнопку отправки.

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

И, наконец, необходима внутренняя проверка. Помощь JavaScript хороша .

Время кода

Имея все это в виду, я создал Y-Validator, используя PHP5 для бэкенда. Есть тестовая версия, с которой можно поиграть, и вы можете скачать код, чтобы следовать, если хотите.

В PHP мы определяем валидацию путем создания экземпляра объекта yValidate :

 <?php  require('y-validate.php');  $v = new yValidate();  $v->add('name','+NAME','namefeedback','Required, valid names are letters, numbers and '-()?'');?> 

Библиотека y-validate.php содержит класс yValidate . Мы начинаем с подачи объекта различных входных данных, которые нуждаются в проверке с помощью функции add() :

  • Первый параметр — это идентификатор или Name поля; переключатели и флажки используют Name (и [] используется для флажков, чтобы PHP получал массив значений), в то время как все другие поля используют ID.
  • Второй параметр — это тип проверки, определенный в закрытой переменной объекта regValidations , которая сопоставляет строку параметра с регулярным выражением для проверки. Это префикс + для обязательных полей.
  • Третий параметр указывает идентификатор тега, в который помещается обратная связь.
  • Четвертый параметр — это текст сообщения, который сообщает пользователю, что ожидается.

С этого момента проверка представленного кода заключается в передаче переменной $_POST через $v->validateAll($_POST) . Он использует сопоставления, определенные в $v->add(...) для проверки ввода, возвращая true или false при проверке, плюс массив ошибок, если применимо. Вот и весь конец зашит!

 <script type="text/javascript" src="y-validate/js/y-validate.js"></script>  <script type="text/javascript">  <?php echo $v->buildJS(); ?>  <?php $v->jsValidations(); ?>  </script> 

Когда мы создаем внешний интерфейс для захвата ввода, мы включаем внешний сценарий y-validate.js . Это создает класс, который похож на скрипт PHP выше. Чтобы связать две проверки, мы вызываем два метода объекта PHP. Во-первых, $v->buildJS создает экземпляр класса проверки JavaScript как объект и присоединяет проверки типа проверки к полям и кнопке отправки, которые были присоединены к объекту PHP с помощью $v->add(...) . Во-вторых, jsValidations подготавливает window.onload для присоединения тех же отношений Name + Regular Expression, которые содержатся в объекте PHP, к полям формы.

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

 <label for="name">Your name <?php echo $v->fieldFeedback('name','namefeedback',$namefeedback);?></label>  <input type="text" name="name" id="name" value="<?php if (isset($name)) echo $name;?>" /> 

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

  1. Первое — это поле, к которому относится обратная связь.
  2. Второй — это идентификатор <em> нужно создать, чтобы получить обратную связь; это соответствует третьему параметру $v->add(...) .
  3. Третий параметр — это начальная подсказка, определенная в четвертом параметре $v->add(...) .

Таким образом, помимо второго параметра в $v->add(...) который устанавливает валидацию для использования, параметры между этими двумя сопоставлениями красиво сочетаются.

Использование единого местоположения для обратной связи означает, что у пользователя есть одно место для поиска помощи, независимо от того, включен JavaScript или нет. Поскольку возможности проверки и помощи ввода создаются из одного и того же объекта, текст обратной связи идентичен как для проверки, так и для помощи ввода. Также, чтобы подчеркнуть вспомогательный характер внешней проверки, сообщение обратной связи помещается в поле обратной связи до того, как произойдет какое-либо взаимодействие. Это заранее запрашивает у пользователя ожидаемый формат, позволяя ему понять его с первого раза.

Как только страница загрузится, событие window.onload запускается и связывает помощь ввода JavaScript со всеми полями и кнопкой отправки; это было установлено в $v->jsValidations . Когда пользователь вносит изменения в поле, события JavaScript, присоединенные window.onload , window.onload , проверяя значения с помощью настроенных регулярных выражений.

Уже там

Я использовал PHP для своей библиотеки (см. Ниже), но и другие языки и фреймворки натолкнулись и на эту идею:

  • PHPCake имеет расширение под названием JS Validator ; это полагается на AJAX для внутренней проверки.
  • Ruby on Rails использует AJAX для прямой проверки валидации на внутреннюю.
  • В настоящее время ведется работа над CodeIgniter .
  • У Питона есть умный парень, который выпустил библиотеку примерно в то же время, когда я начал работать над этим.

Помимо решения Python, большинство валидаторов для этой концепции используют AJAX для отправки полей обратно на сервер для проверки. Поскольку требования валидации обычно не меняются в течение нескольких секунд после запроса страницы и ввода данных пользователем, это дополнительные издержки для валидации каждого поля. Кроме того, эти сценарии не используют лучший способ помочь пользователю — сначала сказать ему, что ожидается. Прикрепляя английское описание проверки к каждому полю и делая его первым полезным подсказкой для подсказки пользователю, что нужно вводить, мы помогаем пользователю сделать это правильно с первого раза. Сколько раз вы смотрели на форму и рычали: «Почему ты не сказал мне об этом, когда я начинал?»

Вывод

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

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

Не забывайте: код для PHP-Validate и образец формы доступны для скачивания .