Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <style type="text/css">
- .validation-error {
- background: #ff9999 !important;
- }
- .err-msg {
- color: red;
- }
- </style>
- <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
- <script type="text/javascript">
- /**
- * Модуль типовых валидаторов.
- * Если норм - возвращают false, если ошибка - сообщение об ошибке.
- */
- var Validators = (function () {
- //Ниже - функции, которые принимают настроечные параметры и возвращают собственно функции валидации.
- /** Число. Больше или равно */
- function gte(compareVal, message) {
- if (!message) message = "Должно быть больше или равно " + compareVal;
- return function (val) {
- var res = +val >= compareVal; //Здесь '+' это быстрая конвертация строки в число
- if (!res) {
- return message;
- } else {
- return false;
- }
- }
- }
- /** Строка. Cоответствие рег. выражению */
- function regexp(regexpStr, message) {
- if (!message) message = "Не соответствует образцу: " + regexpStr;
- var re = new RegExp(regexpStr);
- return function (val) {
- if (!re.test(val)) {
- return message;
- } else {
- return false;
- }
- }
- }
- /** Непустое значение */
- function notEmpty(message) {
- if (!message) message = "Значение не должно быть пустым";
- return function (val) {
- var res = val && val.length && true;
- if (!res) {
- return message;
- } else {
- return false;
- }
- }
- }
- //Возвращаем публичные функции, которые будут видны снаружи
- return {
- notEmpty: notEmpty,
- gte: gte,
- regexp: regexp
- }
- }()); //Функция вызывается сразу после определения. Так создаётся объект-модуль. Google 'js module pattern' или 'IIF'.
- //Имя класса : Массив валидаторов
- var formValidators = {
- 'some-number': [Validators.gte(100)],
- 'some-text' : [Validators.notEmpty('Введи текст'), Validators.regexp('^((?!(хуй|пизда)).)*$', 'Не ругайся, блядь!')],
- 'some-color' : [Validators.notEmpty('Выбери цвет')]
- };
- /**
- * Имя валидатора должно быть прописано в аттрибуте 'data-validator'
- */
- function validateElement(elt) {
- var err = false;
- var $elt = $(elt); //Оборачиваем элемент в jQuery
- var vldName = $elt.data('validator'); //Получаем имя валидатора из атрибута 'data-validator'
- if (vldName) {
- var vlds = formValidators[vldName];
- if (vlds) {
- for (var i=0; i < vlds.length; i++) {
- var vld = vlds[i];
- var res = vld($elt.val()); //Вызываем валидатор, передаём в него value элемента
- if (res) {
- $elt.addClass('validation-error').siblings('.err-msg').text(res);
- if (res && !err) err = true;
- }
- }
- }
- }
- return err;
- }
- /**
- * Элементы, которые нужно проверять, должны иметь класс 'validate'.
- * Так можно проверять не только input, но и select, например.
- *
- * Возвращает true если норм. или false если ошибка.
- */
- function validateForm($frm) {
- var err = false;
- //В имени переменной префикс '$' не обязателен, он просто чтобы было понятно, что это jQuery-объект
- //Находим все элементы внутри формы с классом 'validate',
- //убираем у них класс ошибки и очищаем сообщение, а потом проходим по ним
- var $elts = $frm.find('.validate');
- $elts.removeClass('validation-error').siblings('.err-msg').text('');
- $elts.each(function () {
- var res = validateElement(this); //Здесь this указывает на сам элемент (особенность jQuery)
- if (res && !err) err = true;
- });
- return !err;
- }
- //Этот код будет выполнен после полной загрузки DOM
- $(function () {
- //Привязка обработчика к кнопке
- $('#btn-test').on('click', function (evt) {
- var $frm = $('#my-form'); //Находим форму.
- var ok = validateForm($frm);
- if (ok) {
- //$frm[0].submit(); //Отправка формы ($frm[0] - это значит достать форму из обёртки jQuery (как из массива))
- alert("Всё нормально");
- }
- });
- //Очистка ошибки при фокусе на элементе
- $('.validate').on('focus', function (evt) {
- //Здесь this указывает на сам элемент (особенность jQuery)
- //Далее - оборачиваем элемент в jQuery и убираем класс ошибки и очищаем сообщение
- $(this).removeClass('validation-error').siblings('.err-msg').text('');
- });
- });
- </script>
- </head>
- <body>
- <h2>Валидация формы</h2>
- <form id="my-form" onsubmit="return false"> <!-- Блокируем автоматический submit -->
- <div>
- Текст (без мата): <input class="validate" type="text" name="some_text" data-validator="some-text"/>
- <span class="err-msg"></span>
- </div>
- <div>
- Число (>=100): <input class="validate" type="text" name="some_number" data-validator="some-number"/>
- <span class="err-msg"></span>
- </div>
- <div>
- Цвет:
- <select class="validate" name="some_color" data-validator="some-color">
- <option value="">???</option>
- <option value="red">Красный</option>
- <option value="blue">Синий</option>
- <option value="magenta">Фиолетовый</option>
- </select>
- <span class="err-msg"></span>
- </div>
- <button id="btn-test">Тест</button>
- </form>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement