Dude I use this function, it has 3 methods, one to validate only another CPF only for CNPJ and another called document that validates the two according to the amount of characters in the field. It validates without making dependencies and if the field is empty it does not stick to the field.
jQuery.validator.addMethod("documento", function(value, element) {
// remove pontuações
value = value.replace('.', '');
value = value.replace('.', '');
value = value.replace('-', '');
value = value.replace('/', '');
if (value.length <= 11) {
if (jQuery.validator.methods.cpf.call(this, value, element)) {
return true;
} else {
this.settings.messages.documento = "Informe um CPF valido.";
}
}
else if (value.length <= 14) {
if (jQuery.validator.methods.cnpj.call(this, value, element)) {
return true;
} else {
this.settings.messages.documento = "Informe um CNPJ valido.";
}
}
return false;
}, "Informe um documento valido.");
// validação do CPF
jQuery.validator.addMethod("cpf", function(value, element) {
value = jQuery.trim(value);
value = value.replace('.', '');
value = value.replace('.', '');
cpf = value.replace('-', '');
while (cpf.length < 11)
cpf = "0" + cpf;
var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
var a = [];
var b = 0;
var c = 11;
for (i = 0; i < 11; i++) {
a[i] = cpf.charAt(i);
if (i < 9)
b += (a[i] * --c);
}
if ((x = b % 11) < 2) {
a[9] = 0;
} else {
a[9] = 11 - x;
}
b = 0;
c = 11;
for (y = 0; y < 10; y++)
b += (a[y] * c--);
if ((x = b % 11) < 2) {
a[10] = 0;
} else {
a[10] = 11 - x;
}
var retorno = true;
if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg))
retorno = false;
return this.optional(element) || retorno;
}, "Informe um CPF válido.");
// validação do CNPJ
jQuery.validator.addMethod("cnpj", function(cnpj, element) {
cnpj = jQuery.trim(cnpj);// retira espaços em branco
// DEIXA APENAS OS NÚMEROS
cnpj = cnpj.replace('/', '');
cnpj = cnpj.replace('.', '');
cnpj = cnpj.replace('.', '');
cnpj = cnpj.replace('-', '');
var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
digitos_iguais = 1;
if (cnpj.length < 14 && cnpj.length < 15) {
return false;
}
for (i = 0; i < cnpj.length - 1; i++) {
if (cnpj.charAt(i) != cnpj.charAt(i + 1)) {
digitos_iguais = 0;
break;
}
}
if (!digitos_iguais) {
tamanho = cnpj.length - 2;
numeros = cnpj.substring(0, tamanho);
digitos = cnpj.substring(tamanho);
soma = 0;
pos = tamanho - 7;
for (i = tamanho; i >= 1; i--) {
soma += numeros.charAt(tamanho - i) * pos--;
if (pos < 2) {
pos = 9;
}
}
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
if (resultado != digitos.charAt(0)) {
return false;
}
tamanho = tamanho + 1;
numeros = cnpj.substring(0, tamanho);
soma = 0;
pos = tamanho - 7;
for (i = tamanho; i >= 1; i--) {
soma += numeros.charAt(tamanho - i) * pos--;
if (pos < 2) {
pos = 9;
}
}
resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
if (resultado != digitos.charAt(1)) {
return false;
}
return true;
} else {
return false;
}
}, "Informe um CNPJ valido."); // Mensagem padrão