【问题标题】:JQuery validation resetForm is not workingJQuery验证resetForm不起作用
【发布时间】:2016-12-22 21:20:27
【问题描述】:

我有一个非常简单的问题:有一个带有clear form 按钮的表单。当我单击它时,所有字段都会重置。但我还有一个额外的验证规则:至少应该填写一个额外的字段。清除后,它们当然都是空的,但我不想看到这些验证消息。我希望它清除整个表单,隐藏所有验证消息等等。这是我的代码:

$("a[data-clear]").click(function (event) {
    var now = new Date();
    $("#report_search section:gt(0) input").val("");
    $("#includeDerived").prop("checked", true);
    $("#includeApp").prop("checked", true);
    $("#includeOrg").prop("checked", false);
    $("input[name='FromDate']").datepicker().datepicker("setDate", now.dateAdd("year", -1));
    $("input[name='ToDate']").datepicker().datepicker("setDate", now);
    $("form").validate().resetForm();
    event.preventDefault();
});

我在页面上只有一个表单,所以多个表单不是问题。

期望的结果:表单已清除,验证消息未显示。

实际结果:表单被清除,验证消息仍然存在。


检查字段是否填写的示例规则:

jQuery.validator.addMethod("isSufficientInfo",
    function (value, element, params) {
        var hasPersonInfo = $("input[name='LastName']").val() && $("input[name='FirstName']").val();
        if (hasPersonInfo) {
            return true;
        }
        var hasDocInfo = $("select[name='D']").val() && $("input[name='C']").val() && $("input[name='E']").val();
        if (hasDocInfo) {
            return true;
        }
        return $("input[name='A']").val() || $("input[name='B']").val();
    }, "File some fields");
$("#IsEnoughInfo").rules("add", { isSufficientInfo: "" });

【问题讨论】:

  • 看起来这不适用于 Bootstrap 3(如果您正在使用它)。无论哪种方式,您都可以通过删除错误类来隐藏错误,直到您再次验证。 How to clear Jquery validation error messages
  • 您收到错误消息是因为$("form").validate().resetForm(); 行运行您的验证并生成错误消息。您必须重写逻辑以验证验证器的 submitHandler 中的验证是否适用于您的自定义逻辑。
  • @MeghanArmes 我没有在这个项目中使用引导程序。我当然可以清除 .field-validation-error 字段中的 html,但它看起来很 hacky。我认为有一些适当的方法可以做到这一点。
  • 如果您使用的是我提到的同一个库,那么您可能需要查看resetForm API 调用。
  • 我认为https://jsfiddle.net/1u0tccgg/ 更清楚地描述了您的问题。

标签: javascript jquery forms validation


【解决方案1】:

如果您仍在寻找答案, 我怀疑$("form").validate() 创建了一个新的验证器实例。 你需要的是之前创建的实例:

$("form").data("validator").resetForm()

或者将验证器存储在一个变量中:

var v = $("form").validate()
v.resetForm()

【讨论】:

  • 答案如何?这不是你说的不行吗? `$("form").validate() 仅在不存在时创建一个新的验证器。
【解决方案2】:

错误原因

您的点击事件正在从按钮传播到窗口(由内而外)。这会导致您的表单触发验证,因此即使您调用 resetForm,您也会收到相同的错误消息。如果您逐步调试validation 库并到达this.hideErrors,那么您将看到当this.hideErrors 执行时,错误消息消失了。由于验证脚本尚未完成,它会继续执行其他语句,最后传播的事件由window 从内到外处理。当此事件触发表单上的请求时,再次显示错误消息。

解决方案

解决方法是将你对event.preventDefault()的电话移到顶部,如下图:

$("a[data-clear]").click(function (event) {
    event.preventDefault(); // Move to top

    var now = new Date();
    $("#report_search section:gt(0) input").val("");
    $("#includeDerived").prop("checked", true);
    $("#includeApp").prop("checked", true);
    $("#includeOrg").prop("checked", false);
    $("input[name='FromDate']").datepicker().datepicker("setDate", now.dateAdd("year", -1));
    $("input[name='ToDate']").datepicker().datepicker("setDate", now);

    $("form").validate().resetForm(); // this should work now
});

另见更新后的jsfiddle sample

试一试,让我知道这是否适合您。我做了一步一步的调试,得出了这个结论。

【讨论】:

  • 不,在我的情况下它不起作用。 validator 根本看不到任何错误(当我调试时发现 this.errors() 始终为空)。唯一按预期工作的方法是valid()。但正如我所说,它不会隐藏最后一次检查(我在我的问题中添加)。请参阅上面 @Samundra 的 jsfiddle 上的链接
  • 这很奇怪,也许你也应该添加你的表单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多