Problem with jQuery Validation Plugin

1

I am using the remote feature to check if there is a database in my database with the same cpf. More precise that this field is not mandatory is optional.

So I tried to put required: false but it does not work out that possibility or if it is a query it will only be mandatory.

cpf: {
cpf: true,                          
remote: {
    url: "/clientes/consulta_cliente",
    type: "post",
    data: {cpf: function(){ return $("input[name='cpf']").val();}}
}}

code to validate cpf:true

jQuery.validator.addMethod("cpf", function(value, element) {
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 = new Number;
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; }
if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) return false;
return true;
}, "Informe um CPF válido."); 
    
asked by anonymous 10.09.2014 / 18:21

2 answers

0

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 
    
10.09.2014 / 20:15
1

When a check depends on an entry by users you should use depends , which returns true or false for cpf according to a condition, in this case the field is empty or not:

cpf: {
    cpf: {
        depends: function () {
            return $("input[name='cpf']").val()!='';
        }
    },                          
    remote: {
        url: "/clientes/consulta_cliente",
       type: "post",
       data: {cpf: function(){ return $("input[name='cpf']").val();}}
   }
}

Thus guarantors that only in case the value of the CPF is different from empty is that it does the verification.

As you have in your code it will always check the cpf regardless of whether or not it exists.

    
10.09.2014 / 18:51