Skip to content

Instantly share code, notes, and snippets.

@Koniksan
Last active August 11, 2017 14:59
Show Gist options
  • Save Koniksan/c4c511e08b20caadeb8af1778d1d20a3 to your computer and use it in GitHub Desktop.
Save Koniksan/c4c511e08b20caadeb8af1778d1d20a3 to your computer and use it in GitHub Desktop.
A great validation plugin created by Dmitriy Golovenchik (Lovata.com)

simpleValid

version 1.3.0


  1. Для кнопки устанавливаем [data-valid-form] , для блок на странице где находятся поля [data-valid-init]

  2. В поля, которые нужно проверять добавляем [data-valid-pattern], где указываем имя варианта проверки для поля:
    [data-valid-pattern="required|min:{num}|max:{num}|minnum:{num}|maxnum:{num}|letters|letters-space|en|en-space|ru-space|ru|phone|email|checked|nochecked"]

<input data-valid-pattern="required|required-mask|min:{num}|max:{num}|minnum:{num}|maxnum:{num}|letters|letters-space|en|en-space|ru-space|ru|num|num-space|phone|email|checked|nochecked">

Имена

required - поле не должно быть пустым
required-mask - поле не должно быть пустым (с учетом маски стороннего плагина для этого поля)
min - поле не должно быть меньше числа
max - поле не должно быть больше числа
minnum - поле не должно быть меньше числа
maxnum - поле не должно быть больше числа
letters - только буквы без пробелов
letters-space - только буквы с пробелами
en - только латинские символы без пробелов
en-space - только латинские символы с пробелами
ru - только русские символы без пробелов
ru-space - только русские символы с пробелами
num - только числа
num-space - только числа с пробелами
phone - проверка телефона
email - проверка email
checked - проверка, checkbox включен
nochecked - проверка, checkbox выключен


  1. Для того чтобы поле учитывало маску стороннего плагина, в момент когда оно пустое и выводится только маска, необходимо указать в поле атрибут data-valid-pattern="required-mask" и data-valid-mask="+_ (___) ___ __ __".
    Где "+_ (___) ___ __ __" - это маска, которая будет выводиться сторонним плагином, в момент, когда поле пустое.

  2. Если нужно чтобы валидация не начиналась после нажатия на Enter в активном input, то в этото поле ставим attr со значением [data-valid-enter="off"]

<textarea data-valid-pattern="..." data-valid-enter="off"></textarea>
  1. _simple-valid-error - класс, который будет добавляться к полю по умолчанию, если в нем ошибка. Если у поля стоит attr [data-valid-error], то будет добавляться класс указанный в нем вместо _simple-valid-error.
<input data-valid-pattern="..." data-valid-error="custom-error-class">
  1. Для того чтобы выводилось сообщение об ошибке, нужно создать эдемент в любом месте страницы с attr [data-valid-message]:
  • для вывода сообщения об ошибке одного поля:

Вариант 1 - Вывод ошибки в html:

<div data-valid-pattern="..." data-valid-message="required for name">Сообщение об ошибке</div>

[data-valid-message] - attr в котором указываем required - тип ошибки и name - имя проверяемого поля

Вариант 2 - Вывод ошибки в arr:

<div  data-valid-pattern="..." data-valid-message="required for name" data-valid-custom-message="Сообщение об ошибке"></div>

[data-valid-message] - attr в котором указываем required - тип ошибки и name - имя проверяемого поля
[data-valid-custom-message] - сообщение об ошибке в attr

Если name проверяемого поля не уникально на странице, то для вывода сообщения, вместо name, можно использовать data-name

  • для вывода сообщения об ошибке для совпадающих полей:

Вариант 1
Вывод ошибки в html:
div(data-valid-message="pass") Сообщение об ошибке
[data-valid-message] - attr в котором указываем pass - [data-valid-matches="pass"] - attr в проверяемом поле

Вариант 2
Вывод ошибки в arr:
div.e-message(data-valid-message="pass" data-valid-custom-message="Сообщение об ошибке|data-mega" data-mega)
[data-valid-message] - attr в котором указываем name - имя проверяемого поля
[data-valid-custom-message] - rttr в котором указываем Сообщение об ошибке и после | имя attr, который ноходится в элементе с тектом ошибки, например data-mega

  1. Здля запуска в JavaScript нужно в обработчик отправки контента разместить следующий код:
if(!simpleValid(this)) {
    alert('noValid');
    return;
}

if(!simpleValid(this)) - сработает в случаи, если поля не прошли валидацию.

._simple-valid-error{border-color:red}[data-valid-message]{display:none}[data-valid-message]._showValidMessage{display:block}
"use strict";!function(a){a(document).ready(function(){function r(r,i){var n=i.split(":"),s=a(r),l=s.attr("data-valid-error")||v;switch(n[0]){case"required":if(r.val().trim().length<1)return e(s,l,"required",!0),!1;e(s,l,"required",!1);break;case"required-mask":var d=r.val().trim();if(d.length<1||d===s.attr("data-valid-mask"))return e(s,l,"required-mask",!0),!1;e(s,l,"required-mask",!1);break;case"min":if(r.val().trim().length<n[1])return e(s,l,"min",!0),!1;e(s,l,"min",!1);break;case"max":if(r.val().trim().length>n[1])return e(s,l,"max",!0),!1;e(s,l,"max",!1);break;case"minnum":if(parseFloat(r.val().trim())<parseFloat(n[1]))return e(s,l,"minnum",!0),!1;e(s,l,"minnum",!1);break;case"maxnum":if(parseFloat(r.val().trim())>parseFloat(n[1]))return e(s,l,"maxnum",!0),!1;e(s,l,"maxnum",!1);break;case"letters":var u=t(/^[a-zа-яё]+$/i,r);if(!u)return e(s,l,"letters",!0),!1;e(s,l,"ru-space",!1);break;case"letters-space":var o=t(/^[a-zа-яё ]+$/i,r);if(!o)return e(s,l,"letters-space",!0),!1;e(s,l,"ru-space",!1);break;case"en":var c=t(/^[a-z]+$/i,r);if(!c)return e(s,l,"en",!0),!1;e(s,l,"en",!1);break;case"en-space":var m=t(/^[a-z ]+$/i,r);if(!m)return e(s,l,"en-space",!0),!1;e(s,l,"en-space",!1);break;case"ru-space":var f=t(/^[а-яё ]+$/i,r);if(!f)return e(s,l,"ru-space",!0),!1;e(s,l,"ru-space",!1);break;case"ru":var h=t(/^[а-яё]+$/i,r);if(!h)return e(s,l,"ru",!0),!1;e(s,l,"ru",!1);break;case"num":var p=t(/^[0-9]+$/i,r);if(!p)return e(s,l,"num",!0),!1;e(s,l,"num",!1);break;case"num-space":var y=t(/^[0-9 ]+$/i,r);if(!y)return e(s,l,"num-space",!0),!1;e(s,l,"num-space",!1);break;case"phone":var k=t(/^[\+?\d]+[\d\(\)\ -]+[\d]+$/,r);if(!k)return e(s,l,"phone",!0),!1;e(s,l,"phone",!1);break;case"email":var b=t(/^([A-Z|a-z|0-9](\.|_|-){0,1})+[A-Z|a-z|0-9]\@([A-Z|a-z|0-9](\.|_|-){0,1})+((\.){0,1}[A-Z|a-z|0-9]){1}\.[a-z]{2,4}$/,r);if(!b)return e(s,l,"email",!0),!1;e(s,l,"email",!1);break;case"checked":if(!r.is(":checked"))return e(s,l,"checked",!0),!1;e(s,l,"checked",!1);break;case"nochecked":if(r.is(":checked"))return e(s,l,"nochecked",!0),!1;e(s,l,"nochecked",!1)}return!0}function t(a,r){return a.test(r.val().trim())}function e(a,r,t,e){var i=a,s=i.attr("data-name")||i.attr("name");return e?(a.addClass(r),void n(!0,t,s)):(a.removeClass(r),void n(!1,t,s))}function i(r){var t=a(r),e=t.parents("*[data-valid-init]"),i=v||r.attr("data-valid-error");if(!t.attr("data-valid-matches"))return!0;var s=t.attr("data-valid-matches"),l=e.find('*[data-valid-matches="'+s+'"]'),d=!0,u=!1,o=void 0;try{for(var c,m=l[Symbol.iterator]();!(d=(c=m.next()).done);d=!0){var f=c.value;if(!a(f).hasClass("simple-valid-dirty")&&""==a(f).val().trim())return!0}}catch(h){u=!0,o=h}finally{try{!d&&m["return"]&&m["return"]()}finally{if(u)throw o}}var p=!0,y=!1,k=void 0;try{for(var b,x=l[Symbol.iterator]();!(p=(b=x.next()).done);p=!0){var C=b.value;if(t.val().trim()!==a(C).val().trim())return l.addClass(i),n(!0,s),!1}}catch(h){y=!0,k=h}finally{try{!p&&x["return"]&&x["return"]()}finally{if(y)throw k}}return l.removeClass(i),n(!1,s),!0}function n(r,t,e){var i=void 0,n=void 0;return e?(i=a('[data-valid-message="'+t+" for "+e+'"]'),s(e),void i.each(function(){n=a(this).attr("data-valid-custom-message"),n&&a(this).html(n),r?a(this).addClass(u):a(this).removeClass(u)})):(i=a('[data-valid-message="'+t+'"]'),void i.each(function(){n=a(this).attr("data-valid-custom-message"),n&&(n=n.split("|"),a("["+n[1]+"]").html(n[0])),r?a(this).addClass(u):a(this).removeClass(u)}))}function s(r){var t=a("[data-valid-message]"),e=!0,i=!1,n=void 0;try{for(var s,l=t[Symbol.iterator]();!(e=(s=l.next()).done);e=!0){var d=s.value,v=a(d).attr("data-valid-message").split("for ");v[1]==r&&a(d).removeClass(u)}}catch(o){i=!0,n=o}finally{try{!e&&l["return"]&&l["return"]()}finally{if(i)throw n}}}function l(t){var e=a(t),n=e.attr("data-valid-pattern");n=n.split("|");var s=!0,l=!1,d=void 0;try{for(var v,u=n[Symbol.iterator]();!(s=(v=u.next()).done);s=!0){var o=v.value;if(!r(e,o))return!1}}catch(c){l=!0,d=c}finally{try{!s&&u["return"]&&u["return"]()}finally{if(l)throw d}}return!!i(t)}var d=a(document),v="_simple-valid-error",u="_showValidMessage";window.simpleValid=function(r){var t=a(r),e=t.parents("*[data-valid-init]"),i=a(e).find("input[data-valid-pattern]"),n=a(e).find("textarea[data-valid-pattern]"),s=0;i.addClass("simple-valid-dirty"),n.addClass("simple-valid-dirty");var d=!0,v=!1,u=void 0;try{for(var o,c=i[Symbol.iterator]();!(d=(o=c.next()).done);d=!0){var m=o.value;l(m)||s++}}catch(f){v=!0,u=f}finally{try{!d&&c["return"]&&c["return"]()}finally{if(v)throw u}}var h=!0,p=!1,y=void 0;try{for(var k,b=n[Symbol.iterator]();!(h=(k=b.next()).done);h=!0){var x=k.value;l(x)||s++}}catch(f){p=!0,y=f}finally{try{!h&&b["return"]&&b["return"]()}finally{if(p)throw y}}return 0===s},d.on("blur","input[data-valid-pattern], textarea[data-valid-pattern]",function(){this.value&&"checkbox"!==this.type&&"radio"!==this.type&&(l(this),a(this).addClass("simple-valid-dirty"))}),d.on("change","input[data-valid-pattern]",function(){"checkbox"===this.type&&a(this).hasClass("simple-valid-dirty")&&l(this)}),d.on("keyup","input[data-valid-pattern], textarea[data-valid-pattern]",function(r){var t=a(this);if(13===r.keyCode&&"off"!=t.attr("data-valid-enter")){var e=t.parents("*[data-valid-init]"),i=e.find("*[data-valid-form]");return void a(i).trigger("click")}t.hasClass("simple-valid-dirty")&&l(this)})})}(jQuery);
<form data-valid-init>
<div>
<div class="error-message" data-valid-message="required for name"> Field is empty </div>
<div class="error-message" data-valid-message="max for name"> Max lenght 60 symbols </div>
<div class="error-message" data-valid-message="en-space for name"> Only latinica words </div>
<input type="text" name="name" placeholder="Your name" data-valid-pattern="required|max:60|en-space">
</div>
<button type="submit" data-valid-form>Submit form</button>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment