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
    }
}

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.


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();
    

  • 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.


    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).


    25

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

    $("#myForm").data('validator').resetForm();

    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.


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


    6

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

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

    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);

    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(); });

    3

    Eu testei com:

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

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


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

    Isso destruirá todos os erros de validação


    1

    No meu caso, ajudou na abordagem:

    $(".field-validation-error span").hide();

    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");

    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/

    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());

    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);
                    }
                } 
            }

    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.


    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');  

    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.


    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 = {};

    0

    eu apenas fiz

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

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


    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.


    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');

    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"));

    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');
    Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
    Licensed under cc by-sa 3.0 with attribution required.