├── .gitignore
├── example.html
├── jquery.cpfcnpj.min.js
├── README.md
└── jquery.cpfcnpj.js
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | jquery.mask.js
3 |
--------------------------------------------------------------------------------
/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | jQuery-CPF-CNPJ Plugin
6 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
31 |
32 |
--------------------------------------------------------------------------------
/jquery.cpfcnpj.min.js:
--------------------------------------------------------------------------------
1 | !function(l){function u(n,a){if(""==(n=n.replace(/[^\d]+/g,"")))return!1;if(14!=n.length)return!1;if(/^(.)\1+$/.test(n))return!1;for(tamanho=n.length-2,numeros=n.substring(0,tamanho),digitos=n.substring(tamanho),soma=0,pos=tamanho-7,i=tamanho;1<=i;i--)soma+=numeros.charAt(tamanho-i)*pos--,pos<2&&(pos=9);if(resultado=soma%11<2?0:11-soma%11,resultado!=digitos.charAt(0))return!1;for(tamanho+=1,numeros=n.substring(0,tamanho),soma=0,pos=tamanho-7,i=tamanho;1<=i;i--)soma+=numeros.charAt(tamanho-i)*pos--,pos<2&&(pos=9);return resultado=soma%11<2?0:11-soma%11,resultado==digitos.charAt(1)}function f(n,a){var t=null!=a&&a?/^\d{3}\.\d{3}\.\d{3}\-\d{2}$/:/^[0-9]{11}$/;if(null==n.match(t))return!1;if(null!=n.match(/\b(.+).*(\1.*){10,}\b/g))return!1;var s,e,r=n.replace(/\D/g,"");for(s=0,i=1;i<=9;i++)s+=parseInt(r.substring(i-1,i))*(11-i);if(10!=(e=10*s%11)&&11!=e||(e=0),e!=parseInt(r.substring(9,10)))return!1;for(s=0,i=1;i<=10;i++)s+=parseInt(r.substring(i-1,i))*(12-i);return 10!=(e=10*s%11)&&11!=e||(e=0),e==parseInt(r.substring(10,11))}l.fn.cpfcnpj=function(n){var e=l.extend({mask:!1,validate:"cpfcnpj",event:"focusout",handler:l(this),validateOnlyFocus:!1,ifValid:null,ifInvalid:null,returnType:null},n);if(e.mask)if(null==jQuery().mask)e.mask=!1,console.log("jQuery mask not found.");else{var a=["000.000.000-009","00.000.000/0000-00"],i=l(this);if("cpf"==e.validate)i.mask(a[0]);else if("cnpj"==e.validate)i.mask(a[1]);else{var r=function(n){return 0===n.length||12<=n.length?a[1]:a[0]},o={onChange:function(n,a,i){var t=l(i),s=t.cleanVal();t.mask(r(s),o)}};i.mask(r,o)}}return this.each(function(){var t=null,s=l(this);l(document).on(e.event,e.handler,function(){if(!e.validateOnlyFocus||e.validateOnlyFocus&&s.is(":focus")){var n=s.val(),a=n.length;if(returnType=null,t=!1,11!=a&&14!=a&&18!=a||("cpf"==e.validate?t=f(n,e.mask):"cnpj"==e.validate?t=u(n,e.mask):"cpfcnpj"==e.validate&&(f(n,e.mask)?(t=!0,returnType="cpf"):u(n,e.mask)&&(t=!0,returnType="cnpj"))),l.isFunction(e.ifValid))if(null!=t&&t){if(l.isFunction(e.ifValid)){var i=l.Callbacks();i.add(e.ifValid),i.fire(s)}}else l.isFunction(e.ifInvalid)&&e.ifInvalid(s)}})})}}(jQuery);
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | jQuery-CPF-CNPJ-Validator-plugin
2 | ================================
3 |
4 | Um plugin jQuery para validar CPF ou CNPJ, ou quem sabe os dois...
5 |
6 |
10 |
11 | Indique o campo que deseja validar:
12 |
13 | ```js
14 | $('.validar').cpfcnpj();
15 |
16 | ```
17 |
18 |
19 | ##### Tipo a ser validado (CPF, CNPJ ou os dois)
20 | Para definir o tipo de valor esperado: **validate** podendo ser **'cpf'**, **'cnpj'** ou **'cpfcnpj'** para os dois valores. Default: **'cpfcnpj'**
21 |
22 |
23 | ##### Máscara
24 |
25 | Se desejar máscara no campo, apenas adicione ao **head** o [jQuery-Mask-Plugin](http://igorescobar.github.io/jQuery-Mask-Plugin/) e defina **mask: true**. Se o campo for do tipo **'cpfcnpj'** a mascara será definida conforme digitação do usuário. Default: **false**
26 |
27 |
28 | ##### Quando validar
29 | Para definir em que evento deve acontecer a validação: **event** podendo ser qualquer evento jQuery, exemplo: **click**, **focusout** ou qualquer outro evento. Default: **focusout**
30 |
31 |
32 | ##### Qual elemento deve disparar a validação
33 | Use **handler** podendo ser qualquer valor de um seletor jQuery, exemplo: **'#btn'** ou **'input'**, etc. Default: **o elemento a ser validado**
34 |
35 |
36 | ##### O que fazer se o valor for VÁLIDO?
37 | Essa function será executada se o valor passar pela validação definida.
38 | Defina uma function em:
39 | **ifValid**. Passe um parâmetro para que seja recuperado o controle validado.
40 |
41 |
42 | ##### O que fazer se o valor for INVÁLIDO?
43 | Essa function será executada se o valor NÃO passar pela validação definida. Passe um parâmetro para que seja recuperado o controle validado.
44 | Defina uma function em:
45 | **ifInvalid** podendo exibir um alert, definir o foco, o que quiser...
46 |
47 |
48 | #### Exemplo:
49 |
50 | ```js
51 | $(document).ready(function () {
52 | $('.validar').cpfcnpj({
53 | mask: true,
54 | validate: 'cpfcnpj',
55 | event: 'click',
56 | handler: '.btn',
57 | ifValid: function (input) { input.removeClass("error"); },
58 | ifInvalid: (input) { input.addClass("error"); }
59 | });
60 | });
61 |
62 | ```
63 |
--------------------------------------------------------------------------------
/jquery.cpfcnpj.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * jQuery CPF/CNPJ Validator Plugin v1.1.4
3 | * Developed by: Guilherme Gomes (gmgomess@gmail.com)
4 | * Date: 2019-02-23
5 | */
6 | (function ($) {
7 | $.fn.cpfcnpj = function (options) {
8 | // Default settings
9 | var settings = $.extend({
10 | mask: false,
11 | validate: 'cpfcnpj',
12 | event: 'focusout',
13 | handler: $(this),
14 | validateOnlyFocus: false,
15 | ifValid: null,
16 | ifInvalid: null,
17 | returnType: null
18 | }, options);
19 |
20 | if (settings.mask) {
21 | if (jQuery().mask == null) {
22 | settings.mask = false;
23 | console.log("jQuery mask not found.");
24 | }
25 | else {
26 | var masks = ['000.000.000-009', '00.000.000/0000-00'];
27 | var ctrl = $(this);
28 | if (settings.validate == 'cpf') {
29 | ctrl.mask(masks[0]);
30 | }
31 | else if (settings.validate == 'cnpj') {
32 | ctrl.mask(masks[1]);
33 | }
34 | else {
35 | var cpfCnpjMsk = function (val) {
36 | return val.length === 0 || val.length >= 12 ? masks[1] : masks[0];
37 | }
38 |
39 | var opt = {
40 | onChange: function (val, e, currentField) {
41 | var field = $(currentField);
42 | var value = field.cleanVal();
43 | field.mask(cpfCnpjMsk(value), opt);
44 | }
45 | };
46 | ctrl.mask(cpfCnpjMsk, opt);
47 | }
48 | }
49 | }
50 |
51 | return this.each(function () {
52 | var valid = null;
53 | var control = $(this);
54 |
55 | $(document).on(settings.event, settings.handler,
56 | function () {
57 | if (!settings.validateOnlyFocus || settings.validateOnlyFocus && control.is(':focus')) {
58 | var value = control.val();
59 | var lgt = value.length;
60 | returnType = null;
61 |
62 | valid = false;
63 |
64 | if (lgt == 11 || lgt == 14 || lgt == 18) {
65 | if (settings.validate == 'cpf') {
66 | valid = validate_cpf(value, settings.mask);
67 | }
68 | else if (settings.validate == 'cnpj') {
69 | valid = validate_cnpj(value, settings.mask)
70 | }
71 | else if (settings.validate == 'cpfcnpj') {
72 | if (validate_cpf(value, settings.mask)) {
73 | valid = true;
74 | returnType = 'cpf';
75 | }
76 | else if (validate_cnpj(value, settings.mask)) {
77 | valid = true;
78 | returnType = 'cnpj';
79 | }
80 | }
81 | }
82 |
83 | if ($.isFunction(settings.ifValid)) {
84 | if (valid != null && valid) {
85 | if ($.isFunction(settings.ifValid)) {
86 | var callbacks = $.Callbacks();
87 | callbacks.add(settings.ifValid);
88 | callbacks.fire(control);
89 | }
90 | }
91 | else if ($.isFunction(settings.ifInvalid)) {
92 | settings.ifInvalid(control);
93 | }
94 | }
95 | }
96 | });
97 | });
98 | }
99 |
100 | function validate_cnpj(val, msk) {
101 | val = val.replace(/[^\d]+/g, '');
102 |
103 | // Elimina CNPJs inválidos conhecidos
104 | if (val == '' || val.length != 14 || /^(.)\1+$/.test(val))
105 | return false;
106 |
107 | // Valida DVs
108 | tamanho = val.length - 2
109 | numeros = val.substring(0, tamanho);
110 | digitos = val.substring(tamanho);
111 | soma = 0;
112 | pos = tamanho - 7;
113 | for (i = tamanho; i >= 1; i--) {
114 | soma += numeros.charAt(tamanho - i) * pos--;
115 | if (pos < 2)
116 | pos = 9;
117 | }
118 | resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
119 | if (resultado != digitos.charAt(0))
120 | return false;
121 |
122 | tamanho = tamanho + 1;
123 | numeros = val.substring(0, tamanho);
124 | soma = 0;
125 | pos = tamanho - 7;
126 | for (i = tamanho; i >= 1; i--) {
127 | soma += numeros.charAt(tamanho - i) * pos--;
128 | if (pos < 2)
129 | pos = 9;
130 | }
131 | resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
132 | if (resultado != digitos.charAt(1))
133 | return false;
134 |
135 | return true;
136 | }
137 |
138 | function validate_cpf(val, msk) {
139 | var regex = msk != undefined && msk ? /^\d{3}\.\d{3}\.\d{3}\-\d{2}$/ : /^[0-9]{11}$/;
140 |
141 | if (val.match(regex) != null) {
142 | //check all same numbers
143 | if (val.match(/\b(.+).*(\1.*){10,}\b/g) != null)
144 | return false;
145 |
146 | var strCPF = val.replace(/\D/g, '');
147 | var sum;
148 | var rest;
149 | sum = 0;
150 |
151 | for (i = 1; i <= 9; i++)
152 | sum = sum + parseInt(strCPF.substring(i - 1, i)) * (11 - i);
153 |
154 | rest = (sum * 10) % 11;
155 |
156 | if ((rest == 10) || (rest == 11))
157 | rest = 0;
158 |
159 | if (rest != parseInt(strCPF.substring(9, 10)))
160 | return false;
161 |
162 | sum = 0;
163 | for (i = 1; i <= 10; i++)
164 | sum = sum + parseInt(strCPF.substring(i - 1, i)) * (12 - i);
165 |
166 | rest = (sum * 10) % 11;
167 |
168 | if ((rest == 10) || (rest == 11))
169 | rest = 0;
170 | if (rest != parseInt(strCPF.substring(10, 11)))
171 | return false;
172 |
173 | return true;
174 | }
175 |
176 | return false;
177 | }
178 | }(jQuery));
179 |
--------------------------------------------------------------------------------