Тарифы Услуги Сим-карты

Пишем сама jquery плагин валидации. Применение правил валидации. Определение функции валидации

Сохраните эту страницу для тестирования приведенных ниже примеров.

Основной причиной, по которой приходится прерывать процесс отправки браузером данных формы на сервер является наше желание убедиться в том, что введенные пользователем в полях формы данные корректны.

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

    Первая из них - это непонимание пользователем того, ввод каких данных от него ожидается. Вы, например, запрашиваете имя, указанное на кредитной карте, а пользователь вводит ее номер.

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

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

    Наконец, пользователь может просто ошибиться, что чаще всего связано с обычными опечатками. Например, я печатаю быстро, но не всегда правильно.

Что касается опечаток, то здесь ничего не поделаешь, но от того, как вы справитесь с тремя остальными причинами, зависит, будет ли работа пользователя с вашим приложением идти, как по маслу, или приложение будет лишь раздражать пользователей.

Я не хочу вдаваться в долгие рассуждения относительно дизайна веб-форм и лишь замечу, что лучше всего подходить к решению этого вопроса с точки зрения потребностей пользователя. И если что-то идет не так, постарайтесь взглянуть на проблему (и на возможные пути ее решения) глазами пользователя.

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

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

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

Проверка данных на серверной стороне выполняется в интересах приложения и направлена на то, чтобы некорректные данные не могли стать источником всевозможных проблем. Вы обязаны использовать оба вида проверки, поскольку обойти проверку на клиентской стороне не составляет большого труда, и она не гарантирует надежной защиты вашего приложения.

Настройка параметров проверки

Первое, что вы должны сделать - это добавить в документ подключаемый модуль Validation, как показано ниже:

... ...

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

Следующим шагом является настройка параметров проверки формы. Для этого следует вызвать метод validate() для тех элементов формы, которые вы хотите проверить. В качестве аргумента методу validate() передается объект отображения данных, содержащий конфигурационные настройки, как показано в примере ниже:

$(function() { $("form").validate({ highlight: function(element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function(element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" }); });

Здесь задаются значения четырех параметров (highlight, unhighlight, errorElement и errorClass), назначение которых мы обсудим позднее.

Своей гибкостью подключаемый модуль Validation во многом обязан разнообразию предусмотренных в нем способов простого и быстрого определения правил проверки корректности ввода. Существует много способов связывания правил с элементами. Я предпочитаю тот из них, который основан на использовании классов. Вы определяете набор правил и связываете их с классом, а когда форма подвергается проверке, правила применяются лишь к тем элементам, которые принадлежат указанному классу.

В примере, представленном в примере ниже, создается одно правило:

$(function() { $("form").validate({ highlight: function(element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function(element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" }); $.validator.addClassRules({ flowerValidation: { min: 0 } }) });

В данном случае создается правило, которое будет применяться ко всем элементам, принадлежащим классу flowerValidation. Правило состоит в том, что значение должно быть больше или равно 0. Данное условие выражено в правиле путем указания контрольной проверки min. Это лишь один из многих удобных предопределенных видов контрольной проверки, предоставляемых модулем Validation, и все они будут описаны далее.

Связывание правил с элементами формы достигается путем добавления элементов в класс, указанный на предыдущем шаге. Это позволяет настраивать правила для разных типов элементов. В этом примере все элементы обрабатываются одинаково, и потому все элементы ввода выбираются с помощью jQuery и добавляются в класс flowerValidation, как показано ниже:

$(function() { ... $("input").addClass("flowerValidation").change(function(e) { $("form").validate().element($(e.target)); }); });

Здесь также используется функция, привязанная к событию change. Она непосредственно выполняет проверку элемента, значение которого было изменено. Это гарантирует немедленную обратную связь с пользователем в случае исправления им ошибки.

Также необходимо добавить CSS-правила в разметку документа, для классов, идентифицирующих ошибки:

Div.errorMsg {color: red} .invalidElem {border: medium solid red}

Результат работы подключаемого модуля Validation представлен на рисунке:

Для получения рисунка я ввел -1 в поле ввода и щелкнул на кнопке "Заказать". Текст сообщения, выводимого для пользователя, генерируется модулем проверки. О возможности изменения текста сообщений говорится далее.

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

Использование встроенных проверок

Подключаемый модуль Validation поддерживает большое количество встроенных проверок данных, введенных в полях формы. С одним из них (min) вы уже познакомились в предыдущем примере. Полный список встроенных проверок представлен в таблице ниже:

Встроенные проверки, предусмотренные в модуле Validation Проверка Описание
creditcard: true Значение должно содержать номер кредитной карты
date: true Значение должно быть действительной датой JavaScript
digits: true Значение должно содержать лишь цифры
email: true Значение должно быть действительным адресом электронной почты
max: maxVal Значение не должно превышать maxVal
maxlength: length Значение должно содержать не более length символов
min: minVal Значение не должно быть меньше minVal
minlength: length Значение должно содержать не менее length символов
number: true Значение должно быть десятичным числом
range: Значение должно находиться в пределах указанного диапазона
rangelength: Значение должно содержать не менее minLen и не более maxLen символов
required: true Значение обязательно должно быть указано
url: true Значение должно быть URL-адресом

Несколько правил могут быть объединены в одно. Тем самым обеспечиваются компактность и наглядность кода, осуществляющего проверку. Эти правила могут применяться к элементам несколькими способами. Все они описаны в следующих разделах.

Применение правил проверки на основании принадлежности классам

Чаще всего я пользуюсь методикой, в которой применение правил проверки основывается на классах элементов. Именно такой подход предпринят в данном примере. Однако ничто не заставляет вас ограничиться только одним видом проверки. Для проверки различных аспектов значения, предоставленного пользователем, можно объединить в одном правиле несколько видов проверки, как показано в примере ниже:

$(function() { $("form").validate({ highlight: function(element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function(element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" }); $.validator.addClassRules({ flowerValidation: { required: true, digits: true, min: 0, max: 100 } }) $("input").addClass("flowerValidation").change(function(e) { $("form").validate().element($(e.target)); }); });

В этом примере проверки required, digits, min и max объединены в одно правило, позволяющее убедиться в том, что предоставленное пользователем значение является обязательным для ввода, включает только цифры и находится в интервале от 0 до 100.

Обратите внимание на то, что для связывания правила с классом используется метод addClassRules() . Аргументами этого метода являются один или несколько наборов проверок и имя класса, к которому они применяются. Как видно из примера, метод addClassRules() вызывается для свойства validator основной функции jQuery $().

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

Здесь введено несколько значений, каждое из которых не проходит одного из видов проверки. Важно отметить, что проверки выполняются в том порядке, в каком они определены в правиле. Если вы посмотрите на сообщение для продукта "Пион", то увидите, что оно не прошло проверку digits. Изменив порядок определения проверок, вы получите другое сообщение.

Применение правил проверки непосредственно к элементам

Следующая методика позволяет применять правила к определенным элементам, как показано в примере ниже:

... $.validator.addClassRules({ flowerValidation: { required: true, digits: true, min: 0, max: 100 } }) $("#row1 input").each(function(index, elem) { $(elem).rules("add", { min: 10, max: 20 }) }); ...

Обратите внимание: мы вызываем метод, определяющий правила, для объекта jQuery и передаем ему строку add и объект отображения данных с видами проверок, которые хотим выполнить, и их аргументами. Метод rules() воздействует лишь на первый элемент выбранного набора, и поэтому для расширения сферы его действия мы должны использовать метод each(). В данном случае выбираются все элементы input, являющиеся потомками элемента row1, к которым и применяются указанные проверки.

При вызове метода rules() можно добавлять и удалять отдельные проверки, используя соответственно методы add() и remove().

Правила, применяемые к элементам с использованием методов rules(), интерпретируются до того, как будут интерпретироваться правила, применяемые с использованием классов. В контексте нашего примера это означает, что элементы верхнего ряда будут проверяться с использованием значения min, равного 10, и значения max, равного 20, в то время как к другим элементам input будут применяться соответственно значения 0 и 100. Результат представлен на рисунке:

Изменение диагностических сообщений проверки

В модуле Validation для всех встроенных проверок определены сообщения об ошибках, используемые по умолчанию, однако все они типовые, и пользователь не всегда может извлечь из них полезную информацию (тем более, что они представлены на английском языке).

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

Когда правила применяются к отдельным элементам, можно передавать им объект messages , содержащий требуемые тексты диагностических сообщений. Соответствующий пример приведен ниже:

... $.validator.addClassRules({ flowerValidation: { required: true, digits: true, min: 0, max: 100 } }) $("#row1 input").each(function(index, elem) { $(elem).rules("add", { min: 10, max: 20, messages: { max: "Вы заказали больше 20 цветов", min: "Вы заказали меньше 10 цветов" } }) }); ...

Здравствуйте, уважаемые читатели a! В этой статье рассмотрим jQuery плагин для валидации HTML форм — Validatr от автора @jaymorrow. Для работы плагина нам понадобится подключенная библиотека jQuery. Для валидации плагин использует . А там где это не возможно воспользуется собственными правилами проверки!


Фактически, благодаря этому плагину Вы можете настроить под себя стандартную HTML5 валидацию: изменить текст предупреждений, визуальное оформление предупреждений их расположение и тд. Подключение

Собственно, для подключение нам необходима jQuery и сам плагин:

Остается только выполнить вызов метода validatr для все форм:

1
2
3
4
5


jQuery(function($) {
$("form" ) .validatr() ;
} ) ;

Выросла посещаемость на сайте, возросла нагрузка и обычного хостинга не достаточно?! Попробуйте виртуальный сервер windows – отличный вариант для ресурсоемких проектов.

Настройка

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

Валидатор работает со всеми типами полей формы, логика которых подразумевает проверку. Например при использовании текстовых полей необходимо прописывать собственные правила валидации в виде регулярных выражений указанных в атрибуте pattern .

Небольшой пример использования атрибутов:

1
2
3
4
5
6
7
8
9



Переходим к рассмотрению опций плагина, используемых при его инициализации в jQuery.

Название Тип По-умолчанию Описание
dateFormat Строка ‘yyyy-mm-dd’ Любая комбинация mm , dd , и yyyy с разделителями / , — или .
location Строка right Положение сообщения об ошибке, поддерживаемые значения top , left , right , bottom .
position Функция function ($error, $input) {} Указанная функция на входе получает 2 параметра, jQuery элемент выведенного сообщения об ошибке (error ) и поле на форме с ошибкой (input ).
showall Булево false Показать все сообщения об ошибках сразу при отправке данных формы.
template Строка Формат сообщения об ошибке. Можно использовать HTML и свое стилевое оформление. Обязательна заглушка {{message}} , вместо нее подставляется непосредственно текст сообщения об ошибке.
theme Строка ‘ ‘ Названия классов CSS, добавляемых к HTML разметке сообщения об ошибке. Если не указано используется предопределенный стиль. Изначально могут использоваться 2 темы: bootstrap и jqueryui .
valid Функция $.noop Функция, которая вызывается после успешной проверки формы. Для предотвращения действие по умолчанию (отправки формы) использовать Return false.

Пример использования данных опций.

Есть 2 основных способа, чтобы валидировать форму:

1. Использовать имена классов как правила

Как это работает

Мы добавляем к полю, которое нужно провалидировать, html атрибут «class», и это подключит валидацию.
Итак, если нам нужно, чтобы текстовое поле было обязательным мы добавляем в элемент input значение атрибута class = «required»
Html
JavaScript
$(document).ready(function() { $("form").validate(); });

Так вы можете добавить к определенным классам несколько правил.

Плюсы и минусы такого подхода:
Работает только с правилами, которые не принимают аргументов.
Мы используем html атрибут «class» для того, для чего он не предназначен.
Но его легко установить.
Использование метода «addClassRules»

Использование функции «addClassRules» дает нам возможность использовать составное правило для одного класса.

JavaScript
$.validator.addClassRules({ name: { required: true, minlength: 2 }, zip: { required: true, digits: true, minlength: 5, maxlength: 5 } });
Этот код добавляет 2 новых правила для класса «name» и «zip», и, если у нас есть элемент «input», у которого класс «zip», то к нему применяются правила: его значение является обязательным, пользователь может вводить только цифры и длина должна быть точно 5 символов.

Html

Информация: Чтобы использовать собственное сообщение для определенного правила requires в составном правиле, нам нужно придумать псевдоним для правила «required», создать новое правило с этим псевдонимом и установить для него сообщение по умолчанию.

JavaScript
$.validator.addMethod("newrequired", $.validator.methods.required, "new name is required");

Или мы можем использовать html атрибут «title», его значение будет сообщением об ошибке для составного правила.

Заметка: Валидация по имени класса работает только для правил валидации, не принимающих никаких аргументов.

2. Добавление правил как JSON объекта к методу validate()

По названию, вы должны были догадаться, что этот метод валидации принимает объект json, поэтому мы можем определить поля, которые нам нужно валидировать и правила валидации для них.

Html
JavaScript
$("form").validate({ rules: { userEmail: { email: true, required: true } } });

Заметка: Когда мы передаем объект «rules» функции «validate» ключом должно быть значение атрибута «name», а не значение «id». Как можно увидеть в примере: ключ -это «userEmail», значение атрибута «name», а у атрибута «id» другое значение.

Плюсы и минусы этого подхода:
Этот подход дает нам возможность использовать больше правил валидации, которые принимают аргументы, такие как minlength, remote, equalTo и т.д.
Отличный и настраиваемый вручную контроль над всем.
Но пользователь должен делать отдельную функцию «validate» с разными опциями для каждой формы.

Добавление или удаление динамических правил.

Чтобы добавить правило мы должны использовать метод «rules» для элементов jQuery после того как форма провалидирована и передавать как первый параметр строку «add» и как второй параметр - объект правил, которые мы хотим добавить к этому элементу (также мы можем передавать объект «сообщение» для правил, которые мы добавили).

JavaScript
$(".input").rules("add", { required: true, messages: { required: true } }) Если мы хотим удалить правило или набор правил, мы передаем строку «remove», как первый параметр для метода «rules», а вторым параметром будет строка, которая содержит правила, которые мы хотим удалить, отделенные пробелом.JavaScript $(".input").rules("remove", "min max"); Подход настройки вручнуюJavaScript
var validator = $("form").data("validator"); validator.settings.rules.objectName = { required: true }

Этот подход очень полезен, если у вас есть созданные правила и объекты сообщений, вы можете расширить правила валидатора своими собственными:

JavaScript
$.extend(validator.settings, { rules: rules, messages: messages }); Сообщения валидации и как они работают

Есть три способа настроить сообщение валидации

1. Передать объект «messages» методу «validate». Объект «messages» состоит из пар ключзначение. Ключ - это значение атрибута «name» элемента. Значение - объект, содержащий каждое правило и его сообщение.

JavaScript
$("form").validate({ rules: { userEmail: { email: true, required: true } }, messages: { userEmail: { email: "Please enter your email", required: "*" } } });

2. Определить значение атрибута «title» элемента

Html

3. Использовать сообщение по умолчанию. Когда определяется правило валидации, есть встроенные сообщения по умолчанию для встроенных правил.
Заметка: Эти три способа переопределяют друг друга, основываясь на приоритетности, самый приоритетный - переданный объект «messages», а наименее приоритетный - сообщение по умолчанию.

Добавление собственных правил валидации

Когда мы хотим добавить больше правил валидации, чем определены по умолчанию, мы используем метод $.validator.addMethod

Этот метод принимает как параметры следующее:

  • имя правила;
  • функцию, которая осуществляет валидацию;
  • сообщение по умолчанию.

Функция, которая производит валидацию, может быть с двумя или тремя параметрами

JavaScript
function validationMethod (value, element) // OR function validationMethod (value, element, params)

Давайте объясню эти параметры.

Значение: значение DOM элемента, который будет валидироваться
Элемент: сам элемент DOM
Параметры: то, что мы передаем как значение. Для этого примера правила валидации - это то, чему должен равняться params.
JavaScript
$("form").validate({ rules: { firstname: { compare: { type: "notequal", otherprop: "lastname" } } } });

в этом примере params будет равен {type:«notequal», otherprop: «lastname»}

Пример добавления собственного правила:

JavaScript
$.validator.addMethod("notnumbers", function(value, element) { return !/*/.test(value); }, "Please don"t insert numbers.") Что именно происходит, когда мы вызываем метод «validate»

Когда мы вызваем метод validate на форме, за кулисами происходит много разных вещей:

Создается объект «validator» со всеми правилами и опциями, присоединенными к форме.

Метод «validate» присоединяет «validator» используя "$.data". Мы можем получить его выбрав форму и вызвав функцию jQuery "$.data" и передать ее «validator». Объект «vaidator» - это все метаданные для валидации, которые дают нам возможность доступа к опциям валидации в любое время жизненного цикла страницы.

Используя этот объект, мы можем изменить во время выполнения опции, которые мы передали методу валидации, такие как добавление или удаление правил, изменение поведения, если поле валидное или невалидное, или даже введение селектора игнорирования.

JavaScript
//getting the validator var validator = $("selector").data("validator")

Заметка: Когда вы вызываете метод «validate» на форме, которая уже провалидирована, он вернет только объект «validator», используется также $.data, и все предыдущие опции, переданные методом «validate», будут стерты.

JavaScript
var validator = $(".selector").validate(/* rules will be omitted */)

Присоединение событий формы

Что произойдет, когда мы нажмем submit(отправить форму), и в форме будет введено неверное значение для поля, к которому мы присоединили валидацию. Если одно из полей невалидное, то плагин валидации будет присматриваться к нему более пристально, чтобы проверять, валидное оно или нет, по событиям на этом поле.

Сообытия формы, на которые подписывается плагин - это «click», «focusin», «focusout», «keyup», «submit».

Заметка: Вы можете отключить валидацию по определенным событиям, передав их как ключи в методе validate, и false в качестве значений.

JavaScript
$(".selector").validate({ onfocusout: false, onkeyup: false, onclick: false, onsubmit: false });

Главной причиной прерывания и предотвращения отправки браузером данных на сервер, является то, что вы хотите валидировать значения, которые пользователь вводит в форму. В какой-то момент, любой веб программист понимает, что пользователь может ввести в элемент input все, что угодно. Есть бесчисленное число различных значений, которые, возможно, вы должны обработать, но по моему опыту есть только несколько причин, почему пользователь вводит в форму что-то неожиданное.

Первая причина заключается в том, что пользователь не понимает, каких данных вы ожидаете. Например, вы могли попросить название кредитной карты, а пользователь мог ввести ее номер.

Вторая причина заключается в том, что пользователь не желает давать вам данные, которые вы запросили, и просто пытается заполнить форму как можно быстрее. Такие пользователи пишут в форме все, что угодно, лишь бы побыстрее перейти к следующему этапу. Если у вас есть много пользователей, чей e-mail адрес выглядит вот так [email protected] , тогда вы понимаете, что это проблема.

Третья причина состоит в том, что вы запрашиваете информацию, которой пользователь не обладает. Например, вы спрашиваете гражданина Великобритании, в каком штате он живет. (У нас тут нет штатов, идиот. Не получишь от меня ни гроша.)

И, наконец, пользователь может действительно сделать ошибку, обычно описку. Например, я быстро, но не особо аккуратно набираю текст, и часто я набираю мою фамилию как Freman , вместо Freeman , пропуская одну е.

С опечатками, в принципе, ничего сделать нельзя, но что касается трех других причин, то все зависит от вас, сделаете ли вы приятное и четкое приложение или нечто, что будет раздражать и злить пользователей.

Я не хочу произносить длинную и напыщенную речь о дизайне веб форм, но я хочу сказать, что лучший способ решить эту задачу – это сосредоточиться на том, что хочет получить пользователь. И если все идет не так, попытайтесь увидеть проблему (и пути ее решения) глазами пользователя. Ваши пользователи не знают, как вы выстроили свою систему, они ничего не знают о вашем бизнес процессе; они просто хотят, чтобы что-то у них получилось. Любой будет рад и счастлив, если вы сфокусируетесь на задаче, которую пользователь пытается выполнить, вместо того, чтобы бессмысленно пугать его, если он не предоставит требуемые вами данные.

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

Внимание

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

Плагин Validation можно загрузить с http://bassistance.de/jquery-plugins/jquery-plugin-validation или использовать версию, которую я включил в исходный код для этой книги (доступный на Apress.com). В показано использование этого плагина.

Совет

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

Листинг 13-7: Использование плагина валидации формы Example div.errorMsg { color: red; } .invalidElem { border: medium solid red; } $("form").validate({ }, }, errorElement: "div", errorClass: "errorMsg" }); $.validator.addClassRules({ flowerValidation: { min: 0 } }) $("input").addClass("flowerValidation").change(function (e) { $("form").validate().element($(e.target)); }); }); ${name}: Jacqui"s Flower Shop Place Order

Примечание

HTML5 включает в себя поддержку базовой валидации форм. Это хорошее начало, но все же это очень базово, и до сих пор существуют значительные различия в том, как браузеры интерпретируют спецификацию. Пока не будут реализованы полные, масштабные и последовательные возможности HTML5, я рекомендую работать с валидацией форм jQuery.

Импортирование файла JavaScript

Первая вещь, которую нам нужно сделать, это вставить плагин валидации в документ, вот таким вот образом:

Я использовал отладочную версию файла, но доступна также и минимизированная версия и некоторые, но не все, сервисы CDN, потому что этот файл очень популярен.

Конфигурация валидации

Следующий шаг – это конфигурация валидации элемента form , которую вы делаете, вызвав метод validate для элементов form , для которых вы хотите провести валидацию. Аргументом метода validate является объект-карта, который содержит настройки конфигурации, как показано в.

Листинг 13-8: Конфигурация валидации $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" });

Я указал значения для четырех опций (highlight , unhighlight , errorElement и errorClass); позже я вернусь и объясню их значения.

Определение правил валидации

Гибкость плагина валидации во многом обусловлена способом, которым вы быстро и просто можете указать правила для тестирования правильности ввода данных. Есть много различных путей связывания правил с элементами. Один, которым я стараюсь пользоваться, работает через классы. Вы определяете набор правил и связываете его с классом, и когда форма валидируется, правила применяются ко всем элементам form , которые являются членами указанного класса. Я создал только одно правило в примере, как показано в .

Листинг 13-9: Определение правил валидации $.validator.addClassRules({ flowerValidation: { min: 0 } })

В данном случае я создал новое правило, которое будет применяться ко всем элементам form , которые являются членами класса flowerValidation . Правило заключается в том, что значение должно быть равно или больше 0 . Я выразил в правиле условие, используя min . Это только один из множества удобных стандартных правил валидации, которые предоставляет плагин валидации, и я опишу все из них позже в этой главе.

Применение правил валидации

Вы свяжете правила валидации с элементами в форме, если добавите элементу класс, который вы указали на предыдущем этапе. Это дает вам возможность "подогнать" валидацию для различных видов элементов в форме. Для этого примера все элементы будут обрабатываться одинаково, поэтому я использую jQuery, чтобы выбрать все элементы ввода данных и добавить класс flowerValidation , как показано в .

Листинг 13-10: Добавление элементов input классу, связанному с валидацией $("input").addClass("flowerValidation").change(function (e) { $("form").validate().element($(e.target)); });

Я также использовал функцию, связанную с событием change , чтобы напрямую валидировать элемент, чье значение поменялось. Это гарантирует, что пользователь получит немедленный ответ, если исправит ошибку. Результат работы плагина валидации можно увидеть на . Чтобы получить этот рисунок, я ввел -1 в поле ввода и нажал кнопку Place Order.

Рисунок 13-5: Использование плагина валидации

Совет

Текст сообщения, показанный пользователю, сгенерирован плагином валидации. Я покажу вам, как создавать собственные сообщения далее в этой главе.

Как и при "доморощенной" валидации, которую я показывал вам ранее, пользователь не сможет отправить форму, пока не исправит ошибку, но на этот раз пользователь видит, какое значение или значения ошибочны, и получает рекомендацию, как это исправить.

Использование правил валидации

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

Таблица 13-3: Правила плагина Validation
Правила Описание
creditcard: true Значение должно содержать номер кредитной карты
date: true Значение должно быть текущей JavaScript датой
digits: true Значение должно содержать только цифры
email: true Значение должно быть действительным e-mail адресом
max: maxVal Значение должно быть не больше чем maxVal
maxlength: length Значение должно содержать символов не более, чем length
min: minVal Значение должно быть не меньше чем minVal
minlength: length Значение должно содержать символов не менее, чем length
number: true Значение должно быть десятичным числом
range: Значение должно находиться в пределах minVal и maxVal
rangelength: Значение должно содержать символом минимум minLen и не более, чем maxLen
required: true; Требуемое значение
url: true Значение должно быть URL

Вы можете объединить несколько правил в одно. Это позволит вам провести комплексную валидацию быстро и качественно.

Совет

В дистрибутив плагина валидации входит файл с названием additional-methods.js . Этот файл определяет некоторые дополнительные правила, включая номера телефонов США и Великобритании, адреса IPv4 и IPv6, некоторые дополнительные форматы данных, e-mail и URL.

Эти правила можно применить к элементам различными путями. Каждое из них я опишу в следующих разделах.

Примечание

Плагин Validation также поддерживает удаленную валидацию , когда данные, введенные пользователем, проверяются через удаленный сервер. Это полезно, когда данные не могут быть распределены на клиентскую сторону, потому что это может быть небезопасно или непрактично (например, проверка на то, что имя пользователя не было до сих пор использовано). Я покажу удаленную валидацию в главе 16 , после того, как мы изучим возможности, которые она использует, в главах 14 и .

Применение правил валидации через классы

Как оказалось, наиболее часто я провожу валидацию через классы. Этот подход я применяю и в примере. Кстати, вы не ограничены одним правилом. Можно применять несколько правил вместе, чтобы провести валидацию различных аспектов значения, которое предоставляет пользователь, как показано в .

Листинг 13-11: Объединение нескольких правил в одно $.validator.addClassRules({ flowerValidation: { required: true, digits: true, min: 0, max: 100 } })

В этом примере я объединил правила required , digits , min и max , чтобы убедиться, что пользователь добавит значение, которое содержит только цифры, расположенные в диапазоне от 0 до 100 .

Обратите внимание, что я связываю правило с классом, используя метод addClassRules . Аргументами этого метода являются один или несколько наборов правил и имя класса, к которому они будут применяться. Как показано в примере, вы вызываете метод addClassRules для свойства validator главной jQuery $ функции.

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

Рисунок 13-6: Применение нескольких правил валидации для элементов form

Я ввел различные значения, которые "провалят" одно из правил. Важно отметить, что правила выполняются в том порядке, в котором вы их объединили в одном правиле. Если вы посмотрите на сообщение об ошибке для товара Rose, вы заметите, что он провалился на проверке digits . Если вы поменяете порядок правил, вы можете получить другую ошибку. В показан измененный порядок правил.

Листинг 13-12: Изменение порядка применения правил $.validator.addClassRules({ flowerValidation: { required: true, min: 0, max: 100, digits: true } })

В этом примере я переместил проверку digits в конец правила. Если я введу в поле формы -1 , тогда провалится проверка min , как показано на .

Рисунок 13-7: Изменения порядка применения правил во время проведения валидации
Применение правил валидации напрямую к элементам

Следующая технология позволяет применять правила валидации к отдельным элементам, как показано в .

Листинг 13-13: Применение правил валидации к элементам в выборке $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" }); $.validator.addClassRules({ flowerValidation: { required: true, min: 0, max: 100, digits: true, } }) $("#row1 input").each(function (index, elem) { $(elem).rules("add", { min: 10, max: 20 }) }); $("input").addClass("flowerValidation").change(function (e) { $("form").validate().element($(e.target)); }); });

Обратите внимание, что вы вызываете метод правил для объекта jQuery , передавая ему строку add и объект-карту с правилами проверки, которые вы хотите применить, и их аргументами. Метод rules работает только с первым элементом в выборке, поэтому нужно использовать метод each , если вы хотите более широко применить правила. В данном примере я выбрал все элементы input , которые являются потомками элемента row1 , и применил к ним набор правил.

Совет

Можно удалить правила для элемента, если заменить add на remove при вызове метода rules .

Правила, которые применяются к элементам с использованием метода rules , оцениваются раньше правил, применяемых с использованием класса. Для моего примера это обозначает, что элементы input в верхнем ряду будут проверяться с использованием значения min равном 10 и значением max равном 20 , в то время как другие элементы input будут, соответственно, использовать значения от 0 до 100 . Результат можно увидеть на .

Рисунок 13-8: Применение правил напрямую к элементам

Поскольку вы работаете с каждым элементом в отдельности, вы можете подгонять проверку под свои нужды. В показан пример.

Листинг 13-14: Корректировка правил для элементов $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg" }); $("input").each(function (index, elem) { var rules = { required: true, min: 0, max: data.stocklevel, digits: true } if (Number(data.price) > 3.00) { rules.max--; } $(elem).rules("add", rules); }); $("input").change(function (e) { $("form").validate().element($(e.target)); }); });

В этом примере я подогнал значение правила max , используя объект данных, который я добавил в документ, чтобы сгенерировать элементы с использованием шаблона. Значение правила max устанавливается с использованием свойства stocklevel и корректируется вниз, если цена больше $3 . Если у вас есть данные наподобие этих, вы можете провести гораздо более полезную валидацию. Результат этого изменения можно увидеть на .

Рисунок 13-9: Установление различных значений для правил валидации на основании данных
Применение правил валидации через атрибут элемента name

Можно применить правила валидации к элементам, основываясь на значении атрибута name . Спецификация HTML не требует, чтобы значение атрибута name было уникальным, и одно значение часто используется для категоризации группы элементов form . В моем примере документа цветочного магазина все имена разные, и каждое из них соответствует отдельному продукту. В любом случае, вы можете создать правила, которые соответствуют значению атрибута name , и правила, которые применяются ко всем элементам с этим значением. В показан пример.

Листинг 13-15: Применение правил валидации на основании имени элемента $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); var rulesList = new Object(); for (var i = 0; i < data.length; i++) { rulesList.product] = { min: 0, max: data[i].stocklevel, } } $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg", rules: rulesList

Вы добавляете правила, которые основываются на именах элементов, используя свойство rules объекта конфигурации, который вы передаете методу validate , когда проводите валидацию для form . Обратите внимание, что я просто использовал объект данных, чтобы создать набор правил (также обратите внимание, что свойство product в объекте данных используется для генерирования атрибута name в элементах input). Я стараюсь не использовать такой подход, поскольку мне больше нравится работать напрямую с элементами в документе; но это технология может пригодиться, если у вас есть объект данных и вы хотите провести валидацию, прежде чем элементы формы будут добавлены в документ.

Применение правил валидации с использованием атрибутов элементов

И наконец, вы можете применять правила валидации, используя атрибуты элементов. Плагин валидации проверяет элементы form , чтобы увидеть, определяют ли они атрибуты, которые соответствуют имени встроенных правил проверки; таким образом считается, что для элемента, который определяет атрибут required , требуется обязательная проверка. В показан пример.

Листинг 13-16: Приведение валидации с использованием атрибута элемента $("input").change(function (e) { $("form").validate().element($(e.target)); }); }); ${name}:

Мне нравится эта технология, когда она используется в связке с шаблоном данных; но я считаю, что она загромождает документ, если применяется к статически определенным элементам, потому что одни и те же атрибуты применяются к элементам снова и снова.

Указание сообщений валидации

Плагин валидации определяет сообщения об ошибке по умолчанию для всех встроенных правил, но они довольно общие и не всегда полезны пользователю. Вот простой пример: если вы укажете для проверки max значение 10 , а пользователь введет в поле 20 , тогда сообщение об ошибке будет следующим:

Please enter a value less than or equal to 10

Это сообщение описывает ограничение, которое вы применили к элементу, но оно не дает никаких разъяснений пользователю, почему тут вообще есть лимит. К счастью, вы можете менять эти сообщения, чтобы добавить дополнительный контекст и скорректировать их для своих нужд. Метод, который вы используете для изменения сообщений, зависит, в первую очередь, от того, как вы создавали правила валидации. Вы не можете менять сообщения, если вы применяли правила, используя класс, но в следующих разделах я расскажу, как менять сообщения, еcли были использованы другие технологии.

Указание сообщений для атрибутивной и именной валидации

Если вы используете атрибут name или проверочные атрибуты, чтобы связать правила с элементами, вы можете изменить сообщения, если добавите свойство messages в объект options , который вы передаете методу validate , когда настраиваете валидацию. В показан пример.

Листинг 13-17: Использование свойства messages объекта оbject $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg", messages: { rose: { max: "We don"t have that many roses in stock!" }, peony: { max: "We don"t have that many peonies in stock!" } } }); $("input").change(function (e) { $("form").validate().element($(e.target)); }); });

Вы можете рассматривать структуру объекта, который вы предоставляете, как значение свойства messages . Вы указываете свойство, используя имя элемента, в котором вы заинтересованы, и указываете, чтобы значение этого свойства было объектом-картой между проверкой и новым сообщением, которое вы хотите использовать. В данном примере я изменил сообщение для правила max для элементов с именами rose и peony . Результат можно увидеть на . Оба эти элемента показаны со скорректированным сообщением валидации.

Рисунок 13-10: Изменение сообщение через объект options

Синтаксис для настройки этих сообщений может быть очень дублирующим, поэтому я стараюсь создать объект с нужными мне сообщениями программно, как показано в .

Листинг 13-18: Определение пользовательских сообщений программно $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); var customMessages = new Object(); for (var i = 0; i < data.length; i++) { customMessages.product] = { max: "We only have " + data[i].stocklevel + " in stock" } } $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg", messages: customMessages }); $("input").change(function (e) { $("form").validate().element($(e.target)); }); });

В этом примере я использую свойство stocklevel из объекта данных, чтобы предоставить пользователю более точное и имеющее нужный смысл сообщение.

Изменение сообщений для валидации каждого элемента

Когда вы применяете правила к отдельным элементам, вы можете использовать объект messages , который определит желаемые сообщения. В показано, как это делается.

Листинг 13-19: Указание сообщений для правил, применяемых к каждому элементу $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg", }); $("input").each(function (index, elem) { $(elem).rules("add", { min: 10, max: 20, messages: { max: "You only have " + data.stocklevel + " in stock" } }) }).change(function (e) { $("form").validate().element($(e.target)); }); });

Еще раз, я использовал свойство stockvalue для указания сообщения. Для простоты я взял за предположение, что элементы input расположены в том же порядке, что и единицы данных. Результат использования этого сообщения можно увидеть на .

Рисунок 13-11: Указание сообщений, полученных из объекта данных
Создание пользовательской проверки

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

Листинг 13-20: Создание пользовательской валидации $(document).ready(function () { var data = [ { name: "Astor", product: "astor", stocklevel: "10", price: "2.99" }, { name: "Daffodil", product: "daffodil", stocklevel: "12", price: "1.99" }, { name: "Rose", product: "rose", stocklevel: "2", price: "4.99" }, { name: "Peony", product: "peony", stocklevel: "0", price: "1.50" }, { name: "Primula", product: "primula", stocklevel: "1", price: "3.12" }, { name: "Snowdrop", product: "snowdrop", stocklevel: "15", price: "0.99" }, ]; var templResult = $("#flowerTmpl").tmpl(data); templResult.slice(0, 3).appendTo("#row1"); templResult.slice(3).appendTo("#row2"); $("form").validate({ highlight: function (element, errorClass) { $(element).add($(element).parent()).addClass("invalidElem"); }, unhighlight: function (element, errorClass) { $(element).add($(element).parent()).removeClass("invalidElem"); }, errorElement: "div", errorClass: "errorMsg", }); return Number(value) < Number(args); }, "We don"t have that many in stock"); $("input").each(function (index, elem) { $(elem).rules("add", { min: 0, stock: data.stocklevel }) }).change(function (e) { $("form").validate().element($(e.target)); }); });

Вы указываете пользовательское правило, используя метод addMethod , который вызывается для свойства validator функции $ . Аргументами этого метода являются имя, которым вы хотите обозначить правило, функция, которая используется для проведения валидации, и сообщение, которое будет показано, если валидация не прошла. В этом примере я определил правило с именем stock .

Определение функции валидации

Аргументами пользовательской функции валидации являются значение, введенное пользователем, объект HTMLElement , представляющий элемент формы, и любые аргументы, которые были указаны, когда правило применяется к элементу для валидации, например, вот так:

$(elem).rules("add", { min: 0, stock: data.stocklevel })

Когда я применил правило, я указал значение свойства stocklevel в качестве аргумента для проверки. И это передано пользовательской функции валидации.

function(value, elem, args ) { return Number(value)