如何清除jQuery验证错误信息?

187

我正在使用jQuery验证插件进行客户端验证。当点击“编辑用户”按钮时,会调用函数editUser(),该函数显示错误消息。

但是我想在单击“清除”按钮时清除表单中的错误消息,该按钮调用另一个函数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
    }
}
30个回答

230

您需要使用 resetForm() 方法:

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

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

我从他们的演示之一的源代码中获取了它。

注意:此代码不适用于Bootstrap 3。


34
对于使用 Bootstrap 的用户而言,resetForm() 方法有时可能不能清除表单子元素中所有 .error 的实例。这会导致一些残留的 CSS 样式,比如红色文本颜色,除非你调用.removeClass()。例如:$('#myform .control-group').removeClass('error'); - jlewkovich
14
使用Bootstrap 3时,它无法隐藏字段验证错误。真遗憾。 - The Muffin Man
2
对我来说,它在Bootstrap 3上运行良好。也许问题出在你集成这两个库的方式上? - bernie
4
不,这个重置表单 resetForm 连带着会清空表单数据。 - Codemole
@JLewkovich所说的使用bootstrap3是正确的,必须实现手动重置跳转到检查器并找出哪些类应用于错误。 - Nestor Colt
将以下代码放入你的(s)css文件中: .field-validation-valid{ display: none; } 并调用方法.resetForm()。 - Kross

140

我自己遇到了这个问题。在构建表单时,我需要根据步骤(即某些输入在运行时动态附加)有条件地验证表单的部分内容。因此,有时候下拉选择框需要进行验证,有时候则不需要。但最终,它需要被验证。因此,我需要一个不是临时解决方法的强大方法。我查阅了 jquery.validate 的源代码。

以下是我的解决方案:

  • 通过指示验证成功来清除错误
  • 调用错误显示处理程序
  • 清除所有成功或错误的存储
  • 重置整个表单验证

    以下是代码实现:

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

    作为 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
    太好了,这个解决方案还适用于“ValidationMessageFor”。 - Syed Ali
    1
    太棒了!与Bootstrap和MVC完美配合! - swissben
    5
    首先,感谢!我多年来一直很好地使用它,但现在我发现了一个性能问题:showErrors 进行一些 DOM 操作,并且对表单中的每个元素都进行调用。当在具有约 30 个控件的表单上使用此代码时,浏览器会冻结几秒钟。对我来说,解决方案是将 showErrors 移出循环并在 validator.resetForm 之前只调用一次。据我所知,它的行为完全相同,速度更快。 - Michael Sandino
    1
    直到今天我才发现,如果我在“重置”按钮上使用这种方法,它会删除所有错误,但不再进行验证...即使我尝试重新验证,一切都是有效的。 - Savandy

    61

    如果你只想简单地隐藏错误:

    $("#clearButton").click(function() {
      $("label.error").hide();
      $(".error").removeClass("error");
    });
    
    如果你指定了errorClass,则调用该类来隐藏错误信息而不是上面我用的默认的error

    2
    @mark - 正确,但它并不是设计用来...它们仍然是无效的,我们只是在这种情况下隐藏错误消息。这是接受答案的替代方案,适用于您特别想要隐藏(而不是忽略,例如禁止提交)错误的情况。它比你想象的更常见 :) - Nick Craver
    2
    问题在于当您重置表单并再次编辑时。我的错误对话框显示错误计数,而计数仅会继续累加。即使使用“resetForm”也无济于事。 - mark
    2
    即使我这样做了,但它会导致另一个问题。下一次打开对话框时,验证不会应用! - Vandesh
    这个技巧在Bootstrap 3网站上对我起作用了。只需要将错误类更改为以下内容:$(".has-error").removeClass("has-error"); - Myke Black

    51

    如果您在将验证器附加到表单时没有事先保存它们,您也可以直接调用以下内容:

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

    .validate()会返回你之前附加的相同验证器(如果你这样做了)。


    工作正常,但如果输入字段中有交叉符号,则还需要添加$('.is-invalid').removeClass('is-invalid'); - Sumit Kumar Gupta

    32

    如果您不想使用一个单独的变量,那么可以这样做:

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

    20

    遗憾的是,validator.resetForm()在许多情况下都不起作用。

    我有一个案例,在这个案例中,如果有人在表单上点击“提交”按钮,而表单上某些字段为空,它应该忽略这个“提交”操作。不会出现错误。很容易做到这一点。如果有人填写了部分内容并点击“提交”按钮,它应该标记一些字段为错误。但是,如果他们删除这些值并再次点击“提交”按钮,则应清除错误信息。在这种情况下,由于验证器中没有“currentElements”数组中的元素,因此执行.resetForm()就毫无效果。

    已经有一些bug报告了。

    在修复这些问题之前,您需要使用Nick Craver的答案,而不是Parrots的接受答案。


    只有在 JavaScript 的世界中,这才是可以接受的事态。 - StackOverthrow

    8

    您可以使用:

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

    6
    我认为我们只需要输入参数来清理一切。
    $("#your_div").click(function() {
      $(".error").html('');
      $(".error").removeClass("error");
    });
    

    5
    如果您只想要一个清晰的验证标签,可以使用jquery.validate.js中的resetForm()代码。
    var validator = $('#Form').validate();
    
    validator.submitted = {};
    validator.prepareForm();
    validator.hideErrors();
    validator.elements().removeClass(validatorObject.settings.errorClass);
    

    3

    我测试了以下内容:

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

    当您需要再次验证时,这将是没问题的。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接