- PVSM.RU - https://www.pvsm.ru -
Вам приходилось верстать формы? Приходилось писать скрипт для валидации этих форм на клиенте? Доводилось ли использовать уже существующие плагины/надстройки для валидации форм?
Мне приходилось, но я не был на 100% удовлетворен ни от подхода решения задачи в лоб (собственный скрипт валидации для каждого проекта под его формы), ни от того, как работают существующие сторонние плагины.
Основными проблемами собственных скриптов и плагинов всегда были — гибкость, удобство и простота.
Большое количество data-attributes, необходимых для конфигурации скриптов (как это в Parsley.js) делают и код менее читабельным, и никогда не помнишь, как все они пишутся. Не просто…
Не все плагины хорошо подходили под желаемые HTML-формы, а постоянно писать свои скрипты под разные формы не всегда удобно и разумно.
Создать нечто гибкое, удобно настраиваемое, полностью подконтрольное, с интуитивным синтаксисом и чтоб валидировало.
Решение вылилось в небольшой опенсорсный плагин, который получил название tFormer.js [1].
Пример HTML формы:
<form id="my_form_id">
<input type="text" name="zip" data-rules="a1 l=5" />
<input type="text" name="email" data-rules="* @" />
<input type="submit" value="Submit" />
</form>
Пример минимального определения tFormer:
var my_form_id = new tFormer('my_form_id');
Пример определения tFormer c указанием модификаций:
var my_form_id = new tFormer('my_form_id', {
errorClass: 'my_own_errorClass', // новый класс для полей, которые не проходят валидацию
timeout: 666, // валидационный таймаут
disabledClass: 'i_am_disabled',
onerror: function(){ // обработчик ошибок валидации
console.log('The field with name `' + this.name + '` is not valid');
},
// другие опции ….
fields: { // опции который относятся к конкретным полям
email: {
timeout: 500 // таймаут валидации для поля email
}
}
});
| Правила | Описание |
* |
необходимое поле (значение не может быть пустым) |
@, @s, ip, base64, url |
имейл, имейлы через запятую, IP аддресс, Base64 строка, URL (соответственно) |
<, >, >=, <= |
сравнение значений поля с числами. (пример ">=10" — значение поля должно быть больше или равно 10) |
l=, l<, l>, l>=, l<= |
сравнение количества символов значения поля (пример "l=5" — значение должно состоять из 5 символов) |
=, =# |
сравнение с конкретным значением ('=10', '=some_value') или со значением какого-то поля с указанным id ('=#some_id') |
!=, ! |
не равно или не содержит ('!=some_value' — не равно 'some_value', '!.com' — не содержит '.com') |
c, cv, cm, ca, cd |
валидация кредитных карточек (все типы, visa, mastercard, amex, discover) |
D= |
сравнение на соответствие формату даты (например "D=Y-M-D" — проверяет на соответствие год-месяц-число) |
Пример изменения опций и правил валидации:
my_form_id.set({timeout: 555}); // новый таймаут для валидации
my_form_id.setRules(' ', 'email'); // теперь поле всегда валидно - нет правил
Отдельный объект для валидации (используется основным плагином и может быть использован отдельно от него):
_v_('some value').validateWithRules('* l>5'); // => true
Кастомная функция валидации полей сложного типа (создается девелопером по необходимости)::
var my_form = tFormer('my_form_id', {
fields: {
field_name: {
own: function(){
var my_value = this.value;
var is_ip = _v_(my_value).validateWithRules('* ip');
var is_email = _v_(my_value).validateWithRules('* @');
var is_url = _v_(my_value).validateWithRules('* url');
return (is_ip || is_email || is_url);
}
}
}
});
Методы для контроля состояния формы:
// активировать / деактивировать сабмит кнопку
my_form.submitButtonControl( true ); // алиас - submitButtonOn()
my_form.submitButtonControl( false ); // алиас - submitButtonOff()
// включение / выключени процессинг состояния у сабмит кнопки
my_form.processing( true ); // алиас - processingOn()
my_form.processing( false ); // алиас - processingOff()
// блокировка и разблокировка сабмит кнопки формы
my_form.lock();
my_form.unlock(); // что разблокировать форму надо вызвать unlock() столько раз сколько был вызван lock()
Плагин перешагнул версию 0.3 и сейчас в бете.
Работает в новых версиях браузеров и даже в IE8 (пришлось заморочиться).
Лежит на гитхабе, делается по мере возможности и времени, ждет дополнительных идей и коммитов со стороны всех заинтересовавшихся разработчиков :)
Автор: TjRus
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/33032
Ссылки в тексте:
[1] tFormer.js: http://tformerjs.com/
[2] https://github.com/TjRus/tFormer.js: https://github.com/TjRus/tFormer.js
[3] Источник: http://habrahabr.ru/post/177759/
Нажмите здесь для печати.