Como limpar as mensagens de erro de validação jQuery?

169

Estou usando o plug-in de validação jQuery para validação do lado do cliente. A função editUser()é chamada ao clicar no botão 'Editar usuário', que exibe mensagens de erro.

Mas quero limpar as mensagens de erro no meu formulário, quando clico no botão 'Limpar', que chama uma função separada clearUser().

function clearUser() {
    // Need to clear previous errors here
}

function editUser(){
    var validator = $("#editUserForm").validate({
        rules: {
            userName: "required"
        },
        errorElement: "span",
        messages: {
            userName: errorMessages.E2
        }
    });

    if(validator.form()){
        // Form submission code
    }
}
Vicky
fonte

Respostas:

209

Você quer o resetForm()método:

var validator = $("#myform").validate(
   ...
   ...
);

$(".cancel").click(function() {
    validator.resetForm();
});

Peguei na fonte de uma de suas demonstrações .

Nota: Este código não funcionará no Bootstrap 3.

Papagaios
fonte
31
Para aqueles que usam o bootstrap, há casos em resetForm()que não limpa todas as instâncias dos .errorelementos filho do formulário. Isso deixará CSS residual como a cor do texto em vermelho, a menos que você ligue .removeClass(). Exemplo:$('#myform .control-group').removeClass('error');
jlewkovich 30/05
14
Usando o bootstrap 3, isso não oculta os erros de validação de campo. Que pena.
The Muffin Man
2
Funciona para mim com o Bootstrap 3. Talvez o problema esteja na sua integração das duas bibliotecas?
Bernie
3
Não, este resetForm literalmente também descansará os dados do formulário.
Codemole
o que @JLewkovich diz usando bootstrap3 é verdade, deve implementar um salto reajuste manual no inspetor e descobrir o que as classes estão aplicando em erros
Nestor Colt
126

Eu me deparei com esse problema. Eu tive a necessidade de validar condicionalmente partes de um formulário enquanto o formulário estava sendo construído com base em etapas (ou seja, certas entradas foram dinamicamente anexadas durante o tempo de execução). Como resultado, algumas vezes um menu suspenso de seleção precisaria de validação e outras vezes não. No entanto, no final da provação, ele precisava ser validado. Como resultado, eu precisava de um método robusto que não fosse uma solução alternativa. Eu consultei o código fonte para jquery.validate.

Aqui está o que eu vim com:

  • Apague os erros indicando o sucesso da validação
  • Manipulador de chamada para exibição de erro
  • Limpar todo o armazenamento de sucesso ou erros
  • Redefinir a validação de formulário inteiro

    Aqui está o que parece no código:

    function clearValidation(formElement){
     //Internal $.validator is exposed through $(form).validate()
     var validator = $(formElement).validate();
     //Iterate through named elements inside of the form, and mark them as error free
     $('[name]',formElement).each(function(){
       validator.successList.push(this);//mark as error free
       validator.showErrors();//remove error messages if present
     });
     validator.resetForm();//remove error class on name elements and clear history
     validator.reset();//remove all error and success data
    }
    //used
    var myForm = document.getElementById("myFormId");
    clearValidation(myForm);
    

    compactado como uma extensão jQuery:

    $.fn.clearValidation = function(){var v = $(this).validate();$('[name]',this).each(function(){v.successList.push(this);v.showErrors();});v.resetForm();v.reset();};
    //used:
    $("#formId").clearValidation();
    
  • Travis J
    fonte
    2
    isso é ótimo, esta solução também está trabalhando com "ValidationMessageFor"
    Syed Ali
    1
    Ótimo! Funciona perfeitamente com Bootstrap e MVC!
    swissben
    2
    Primeiro de tudo, obrigado! Isso funcionou muito bem há anos, mas agora descobri um problema de desempenho: showErrorsfaz alguma manipulação do DOM e é chamado para todos os elementos no formulário. O navegador congelou por alguns segundos ao usar esse código em um formulário com ~ 30 controles. A solução para mim foi showErrorssair do circuito e chamá-lo uma vez logo antes validator.resetForm. Pelo que sei, ele se comporta exatamente da mesma maneira e é muito mais rápido.
    Michael Sandino
    Eu tenho usado isso até hoje e descobri que, se eu usar esse método no botão "Redefinir", ele remove todos os erros, mas não há mais validação ... mesmo se eu tentar validar novamente, tudo será válido
    Savandy 27/03/19
    58

    Se você deseja simplesmente ocultar os erros:

    $("#clearButton").click(function() {
      $("label.error").hide();
      $(".error").removeClass("error");
    });
    

    Se você especificou o errorClass, chame essa classe para ocultar error(o padrão) que eu usei acima.

    Nick Craver
    fonte
    2
    @mark - correto, mas não foi projetado para ... eles ainda são inválidos, estamos apenas ocultando as mensagens de erro neste caso. Esta é uma alternativa à resposta aceita nos casos em que você deseja ocultar especificamente (não ignorar, por exemplo, não permitir o envio) dos erros. Ele aparece com mais frequência do que você imagina :)
    Nick Craver
    1
    O problema é quando você redefine o formulário novamente e o edita novamente. Minha caixa de diálogo de erro exibe a contagem de erros e a contagem continua sendo resumida. Mesmo 'resetForm' não ajuda.
    marque
    1
    Até eu fiz isso, mas isso leva a outra questão. As validações não se aplicam na próxima vez que a caixa de diálogo for aberta!
    Vandesh
    Essa técnica funcionou para mim em um site do Bootstrap 3. Só tive que alterar a classe de erro para o seguinte: $(".has-error").removeClass("has-error");
    Myke Black
    42

    Se você não salvou anteriormente os validadores ao anexá-los ao formulário, também pode simplesmente chamar

    $("form").validate().resetForm();

    como .validate()retornará os mesmos validadores que você anexou anteriormente (se você fez isso).

    Juri
    fonte
    25

    Se você quiser fazê-lo sem usar uma variável separada, então

    $("#myForm").data('validator').resetForm();
    Abhijit Mazumder
    fonte
    18

    Infelizmente, validator.resetForm()NÃO funciona, em muitos casos.

    Eu tenho um caso em que, se alguém clicar no "Enviar" em um formulário com valores em branco, ele deverá ignorar o "Enviar". Sem erros. Isso é fácil o suficiente. Se alguém colocar um conjunto parcial de valores e clicar em "Enviar", deve sinalizar alguns dos campos com erros. Se, no entanto, eles apagarem esses valores e clicarem em "Enviar" novamente, deverá limpar os erros. Nesse caso, por algum motivo, não há elementos na matriz "currentElements" dentro do validador, portanto, a execução .resetForm()não faz absolutamente nada.

    Há bugs publicados nisso.

    Até o momento em que eles os corrigem, você precisa usar a resposta de Nick Craver, a resposta NÃO aceita pelos papagaios.

    Meower68
    fonte
    Somente no mundo JavaScript esse é um estado de coisas aceitável.
    StackOverthrow
    7

    Você pode usar:

    $("#myform").data('validator').resetForm();
    Brain Balaka
    fonte
    6

    Eu acho que só precisamos inserir as entradas para limpar tudo

    $("#your_div").click(function() {
      $(".error").html('');
      $(".error").removeClass("error");
    });
    Karra Max
    fonte
    5

    Se você quiser apenas rótulos de validação claros, poderá usar o código de jquery.validate.js resetForm ()

    var validator = $('#Form').validate();
    
    validator.submitted = {};
    validator.prepareForm();
    validator.hideErrors();
    validator.elements().removeClass(validatorObject.settings.errorClass);
    Chintsu
    fonte
    4

    Para aqueles que usam o código do Bootstrap 3 abaixo, limparão todo o formulário: mensagens, ícones e cores ...

    $('.form-group').each(function () { $(this).removeClass('has-success'); });
    $('.form-group').each(function () { $(this).removeClass('has-error'); });
    $('.form-group').each(function () { $(this).removeClass('has-feedback'); });
    $('.help-block').each(function () { $(this).remove(); });
    $('.form-control-feedback').each(function () { $(this).remove(); });
    Sebastian Xawery Wiśniowiecki
    fonte
    3

    Eu testei com:

    $("div.error").remove();
    $(".error").removeClass("error");

    Tudo ficará bem quando você precisar validá-lo novamente.

    Trung
    fonte
    1
    var validator = $("#myForm").validate();
    validator.destroy();

    Isso destruirá todos os erros de validação

    Kiran
    fonte
    1

    No meu caso, ajudou na abordagem:

    $(".field-validation-error span").hide();
    Taras Strizhyk
    fonte
    Nenhuma das outras respostas funcionou, mas sua resposta funcionou bem, obrigado
    Arash.Zandi 16/03
    1

    Se você deseja ocultar uma validação no lado do cliente que não faz parte de um envio de formulário, use o seguinte código:

    $(this).closest("div").find(".field-validation-error").empty();
    $(this).removeClass("input-validation-error");
    mbadeveloper
    fonte
    1

    Tentei todas as respostas. A única coisa que funcionou para mim foi:

    $("#editUserForm").get(0).reset();

    Usando:

    jquery-validate/1.16.0
    
    jquery-validation-unobtrusive/3.2.6/
    Artur Kędzior
    fonte
    1

    Nenhuma das outras soluções funcionou para mim. resetForm()está claramente documentado para redefinir o formulário real, por exemplo, remover os dados do formulário, o que não é o que eu quero. Às vezes acontece que não faz isso, mas apenas remove os erros. O que finalmente funcionou para mim é o seguinte:

    validator.hideThese(validator.errors());
    jlh
    fonte
    0

    Tente usar isso para remover a validação no clique em cancelar

     function HideValidators() {
                var lblMsg = document.getElementById('<%= lblRFDChild.ClientID %>');
                lblMsg.innerHTML = "";           
                if (window.Page_Validators) {
                    for (var vI = 0; vI < Page_Validators.length; vI++) {
                        var vValidator = Page_Validators[vI];
                        vValidator.isvalid = true;
                        ValidatorUpdateDisplay(vValidator);
                    }
                } 
            }
    ensolarado goyal
    fonte
    Esta função está trabalhando no botão de cancelamento e onde mais quiser usar este é good.try-lo
    goyal ensolarado
    0

    Tente usar:

    onClick="$('.error').remove();"

    no botão Limpar.

    ZhukovRA
    fonte
    0

    Para remover o resumo da validação, você pode escrever este

    $('div#errorMessage').remove();

    No entanto, após a remoção, novamente, se a validação falhar, ele não mostrará este resumo de validação porque você a removeu. Em vez disso, use hide e display usando o código abaixo

    $('div#errorMessage').css('display', 'none');
    
    $('div#errorMessage').css('display', 'block');  
    Shathar Khan
    fonte
    0

    Nenhuma das soluções acima funcionou para mim. Fiquei decepcionado por desperdiçar meu tempo com eles. No entanto, existe uma solução fácil.

    A solução foi alcançada comparando a marcação HTML para o estado válido e a marcação HTML para o estado de erro.

    Nenhum erro produziria:

            <div class="validation-summary-valid" data-valmsg-summary="true"></div>

    quando ocorre um erro, essa div é preenchida com os erros e a classe é alterada para validation-summary-errors:

            <div class="validation-summary-errors" data-valmsg-summary="true"> 

    A solução é muito simples. Limpe o HTML da div que contém os erros e altere a classe novamente para o estado válido.

            $('.validation-summary-errors').html()            
            $('.validation-summary-errors').addClass('validation-summary-valid');
            $('.validation-summary-valid').removeClass('validation-summary-errors');

    Feliz codificação.

    Pedro, o Deus da Programação
    fonte
    0

    Se você deseja redefinir numberOfInvalids()também, adicione a seguinte resetFormfunção de jquery.validate.jslinha no número da linha do arquivo: 415.

    this.invalid = {};
    Maximus
    fonte
    0

    eu apenas fiz

    $('.input-validation-error').removeClass('input-validation-error');

    para remover a borda vermelha nos campos de erro de entrada.

    michaelhsilva9944
    fonte
    0

    $(FORM_ID).validate().resetForm(); ainda não está funcionando como esperado.

    Estou limpando a forma com resetForm(). Funciona em todos os casos, exceto um !!

    Quando carrego qualquer formulário via Ajax e aplico a validação de formulário após carregar minha dinâmica HTML, depois quando tento redefinir o formulário resetForm()e ele falha, além de liberar toda a validação que estou aplicando nos elementos do formulário.

    Portanto, não use isso para formulários carregados no Ajax OU para validação inicializada manualmente.

    PS: Você precisa usar a resposta de Nick Craver para esse cenário, como expliquei.

    Parixit
    fonte
    0

    validator.resetForm()método limpar texto de erro. Mas se você deseja remover a borda VERMELHA dos campos, é necessário remover a classehas-error

    $('#[FORM_ID] .form-group').removeClass('has-error');
    Jay
    fonte
    0

    Função usando as abordagens de Travis J , JLewkovich e Nick Craver ...

    // NOTE: Clears residual validation errors from the library "jquery.validate.js". 
    // By Travis J and Questor
    // [Ref.: https://stackoverflow.com/a/16025232/3223785 ]
    function clearJqValidErrors(formElement) {
    
        // NOTE: Internal "$.validator" is exposed through "$(form).validate()". By Travis J
        var validator = $(formElement).validate();
    
        // NOTE: Iterate through named elements inside of the form, and mark them as 
        // error free. By Travis J
        $(":input", formElement).each(function () {
        // NOTE: Get all form elements (input, textarea and select) using JQuery. By Questor
        // [Refs.: https://stackoverflow.com/a/12862623/3223785 , 
        // https://api.jquery.com/input-selector/ ]
    
            validator.successList.push(this); // mark as error free
            validator.showErrors(); // remove error messages if present
        });
        validator.resetForm(); // remove error class on name elements and clear history
        validator.reset(); // remove all error and success data
    
        // NOTE: For those using bootstrap, there are cases where resetForm() does not 
        // clear all the instances of ".error" on the child elements of the form. This 
        // will leave residual CSS like red text color unless you call ".removeClass()". 
        // By JLewkovich and Nick Craver
        // [Ref.: https://stackoverflow.com/a/2086348/3223785 , 
        // https://stackoverflow.com/a/2086363/3223785 ]
        $(formElement).find("label.error").hide();
        $(formElement).find(".error").removeClass("error");
    
    }
    
    clearJqValidErrors($("#some_form_id"));
    Eduardo Lucio
    fonte
    0

    Escreva o próprio código, porque todo mundo usa um nome de classe diferente. Estou redefinindo a validação do jQuery por esse código.

    $('.error').remove();
            $('.is-invalid').removeClass('is-invalid');
    Sumit Kumar Gupta
    fonte