【问题标题】:Jquery validation error messages are not hiding, whyJquery验证错误消息没有隐藏,为什么
【发布时间】:2014-02-24 10:27:36
【问题描述】:

我正在使用 jquery 验证和 jquery 不显眼的验证插件。我试图隐藏错误消息,但错误消息没有隐藏。我创建了一个 js 小提琴:

Fiddle Link

以下是我在小提琴中使用的代码:

HTML

<form id="form">
    Name:
    <input data-val="true" data-val-length="The field First Name must be a string with a minimum length of 3 and a maximum length of 15." data-val-length-max="15" data-val-length-min="3" name="FirstName" type="text" />
    <span class="field-validation-valid help-block" data-valmsg-for="FirstName" data-valmsg-replace="true"></span>
</form>
<button id="hide">Hide</button>

隐藏

JS

$("#hide").click(function(){
   $("#form").data("validator").hideErrors();
});

我在这里缺少什么以及为什么 hideErrors() 函数不起作用??

编辑

我不知道为什么你们在给出答案时没有记住 jquery 不显眼的验证。几乎所有的答案都只是关注如何隐藏错误消息,而不用担心如果我们只是隐藏消息可能会破坏现有功能。我已经提到我想要的答案

为什么 jquery 验证器对象的 hideErrors() 函数不起作用?

我还创建了一个最简单的小提琴来演示我的问题,check this。

【问题讨论】:

  • 我们都理解您的问题是什么,但 jQuery 验证器并不是为了在单击时隐藏消息而开发的。这对用户非常不友好,因为您看不到自己做错了什么,并且许多用户会认为该站点无法正常工作。这就是为什么。所以,我认为,没有真正的方法来隐藏消息(参见文档,hideErrors() 在resetForm 中被调用)

标签: javascript jquery jquery-validate unobtrusive-validation


【解决方案1】:

如果你想隐藏验证错误信息,你应该使用 resetForm 函数而不是 hideErrors 函数。正如其他人在他们的回答中提到的那样,resetForm 在内部调用 hideErrors 函数。

但问题来了,当您尝试使用 resetForm 函数时,由于 jquery.validate.unobtrusive 插件的工作方式,它不会工作。

jquery.validate.unobtrusive 插件覆盖了 jquery.validate 插件的 errorClass 和 errorElement 属性。

来自 jquery.validate.unobtrusive 插件代码 Line-109

    .... 
    if (!result) {
        result = {
            options: {  
                errorClass: "input-validation-error",
                errorElement: "span",
                errorPlacement: $.proxy(onError, form),
    ...

所以当你在验证器对象上调用 resetForm 函数时,jquery.validate 插件找不到要删除的错误标签,因此验证错误消息不会被删除。

现在您有两个选项可以删除错误消息:

选项 - 1

您可以编辑 jquery.validate.unobtrusive 插件代码并将 errorClass 和 errorElement 值替换为以下值:

    errorClass: "error",
    errorElement: "label",

这些是 jquery.validate 插件使用的默认值。

选项 - 2

您可以编写自己的代码来解决问题,这样您就不必修改插件代码。 Here is the code which you can use 稍作修改如下:

        // get the form 
        var form = $("#formId");

        // get validator object
        var validator = form.validate();

        // get errors that were created using jQuery.validate.unobtrusive
        var errors = form.find(".field-validation-error span");

        // trick unobtrusive to think the elements were succesfully validated
        // this removes the validation messages
        errors.each(function () { validator.settings.success($(this)); })

        //this is optional, only needed if you defined 
        //custom unhighlight function  
        if (validator.settings.unhighlight) {
            for (i = 0, elements = validator.invalidElements() ; elements[i]; i++) {
                validator.settings.unhighlight.call(validator, elements[i], validator.settings.errorClass, validator.settings.validClass);
            }
        }

【讨论】:

  • 试图更好地了解它是如何工作的。为什么必须“巧妙地认为元素已成功验证”而不是仅仅从 DOM 中删除错误元素?我尝试了 $(myform).remove(".field-validation-error") 并且错误消息仍然存在。
【解决方案2】:

您可以使用$(".help-block").toggle(); 或$(".help-block").hide(); 来解决此问题。

http://jsbin.com/leyacefi/10/edit?html,js,output

我已经做了一个解决方法。检查它是否符合您的需求:

$("#hide").click(function(){
    $(".help-block").hide();
});

$('#form').keyup(function(){
  $(".help-block").show();
});

http://jsbin.com/leyacefi/11/

回答您的问题:

函数hideErrors 正在调用this.addWrapper( this.toHide ).hide();,因此它首先运行返回上下文的函数addWrapper,然后调用hide 函数。函数hide 调用showHide 函数,其中一个参数是elements。 elements.length 将是 0,因此在设置 CSS 的 elem.style.display = show ? values[ index ] || "" : "none"; 之前它永远不会到达。所以,属性永远不会改变。

【讨论】:

  • 点击隐藏按钮消息隐藏后,但在输入错误时它不会再次显示,我期待这个问题的答案为什么 hideErrors() FUNCTION ARE NOT WORKING ?
  • 您必须清楚并将其放在您的问题中。目前你在问如何隐藏它们,这就是我向你展示的:)
【解决方案3】:

我建议您在使用任何插件之前阅读文档。 如果您看到验证器插件文档,则清楚地提到了

    Validator

The validate method returns a Validator object that has a few public methods that you can  use to trigger validation programmatically or change the contents of the form. The validator object has more methods, but only those documented here are intended for usage

方法 .hideErrors() 未在文档中列出。因此,根据文档,您不应该使用它。

但在 javascript(你可以说 jquery)中,很多都是可能的。因此,即使他们不允许您在 jquery 对象上调用它,您也可以在 DOM 上调用它。

像这样简单地使用。

   $("#hide").click(function(){
   $("#form").data("validator")[0].hideErrors();
});

【讨论】:

  • 我已经阅读了文档,顺便说一句,你给定的解决方案不起作用,你可以在我的小提琴中测试它,我已经与问题链接了
  • 我不知道你所说的本地是什么意思,但请检查这个小提琴jsbin.com/leyacefi/12/edit,你的解决方案不起作用
  • 本地表示:将代码复制并粘贴到记事本文件中,并保存为.html,然后在浏览器中运行。您的要求是,您不希望在输入少于 3 个字符或多于 15 个字符时显示错误消息,对吗?如果这是您的要求,您可以在本地尝试使用和不使用 [0]
【解决方案4】:

您的代码应如下所示:

$(document).ready(function() { 
        $("#hide").click(function(){ 
            $("span.help-block").hide();
        }); 

}); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多