├── .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 | --------------------------------------------------------------------------------