【问题标题】:Cannot get validation message to clear after updating input field value via JavaScript通过 JavaScript 更新输入字段值后无法清除验证消息
【发布时间】:2014-09-05 13:37:40
【问题描述】:

我有一个表单,我正在使用 jQuery 验证插件在客户端进行验证。为简洁起见,我创建了一个简单的测试用例来显示我的问题。该表单有一个文本输入字段和一个隐藏输入字段。

<script>
    function testThis() {
        alert('value before: ' + $("#testhidden").val());
        $("#testhidden").val("sometext");
        alert('value after: ' + $("#testhidden").val());
    }
</script>
<form name="testform" id="testform" method="post" action="">
    Enter Text: <input type="text" id="testfield" title="test field is required" name="testfield" size="20" minlength="2" maxlength="10" required="required" />
    <input type="hidden" id="testhidden" title="hidden field is required" name="testhidden" minlength="4" required="required" />
    <p><input type="button" id="addvalue" name="addvalue" value="Add Value via JavaScript" onclick="testThis();" /></p>
    <p><input type="submit" id="testbutton" name="testbutton" value="Submit Form" /></p>
</form>

验证这两个字段是必需的并且必须具有一定的长度;隐藏字段至少 4 个字符,文本字段至少 2-10 个字符。我需要注意的是,表单加载到 DOM 后,隐藏字段正在通过 JavaScript 更新。

我创建了a fiddle to demonstrate my problem。对于这个测试,我添加了一个按钮来模拟我如何通过 JavaScript 修改隐藏输入的值。要测试这样做:

  1. 尝试在不输入任何文本的情况下提交表单。您应该得到 2 个验证错误。
  2. 接下来在文本输入字段中输入文本,输入至少 2 个字符后,应隐藏第一条验证消息。
  3. 如果您此时尝试提交,由于隐藏字段要求,它仍然不会提交。
  4. 接下来单击通过 JavaScript 添加值按钮。我正在提醒之前和之后的值。此时,一旦隐藏字段具有正确的数据,我希望隐藏验证消息,但事实并非如此。
  5. 此时表单将提交,因为已满足验证条件但仍显示错误消息。

如何在隐藏字段包含适当的文本后隐藏验证消息?

这是我用来配合上面的测试表单的简单验证调用:

$("#testform").validate({errorElement:"div",ignore:[]});

如果重要的话,我使用的是 jQuery 1.11.1 和 jQuery Validate 1.12.0

更新

虽然 Pointy 的回答并没有解决问题,但我认为他正朝着正确的方向前进。我需要一些方法来触发在更新隐藏字段后触发验证。通过添加第二个输入文本字段,我现在拥有updated my fiddle。我还通过 JavaScript 更新这个输入字段。当我通过 JavaScript 更新后在这个新字段上触发 blur() 事件时,它正确地隐藏了验证消息。但是在隐藏字段上做同样的事情仍然不起作用。它肯定与它是一个隐藏的领域有关......

【问题讨论】:

    标签: javascript jquery jquery-validate


    【解决方案1】:

    引用OP

    “我需要一些方法来触发验证...”

    插件提供a method called .valid(),其唯一目的是以编程方式触发验证,无论是在单个字段上还是在整个表单上。

    “这肯定与它是一个隐藏的领域有关”

    常规输入字段的验证通常由 keyup 和 blur 等事件触发。由于您在隐藏字段上没有这些事件,您只需使用.valid() 方法手动触发验证。

    $("#testhidden").valid();
    

    我已将您的函数修改如下,并且由于您使用的是 jQuery,因此还删除了内联 JavaScript...

    $('#addvalue').on('click', function() {
        alert('value before: ' + $("#testhidden").val());
        $("#testhidden").val("sometext");
        $("#testhidden").valid(); // <- manually trigger validation of this field
        alert('value after: ' + $("#testhidden").val());
    });
    

    演示:http://jsfiddle.net/opzg6uxn/2/


    但是,我不明白您为什么需要验证超出用户控制范围的内容。换句话说,既然隐藏字段是通过程序控制的,那么首先对其应用验证有什么意义呢?

    【讨论】:

    • 我认为您在这里找到了解决方案,我喜欢它,因为它使用了插件的内置功能。我知道我的用例看起来很奇怪,但正如我试图在另一条评论中解释的那样,实际情况是用户完成了一个更新隐藏字段的验证码。我希望在提交表单之前使用与表单相同的验证来验证 CAPTCHA 响应。希望这有助于解释它。感谢您提供有用的答案!
    • @Miguel-F,我明白了。但是,我希望您的 CAPTCHA 正在服务器上进行评估,因为 JavaScript 很容易被用户绕过和操纵。
    • 绝对是!我也在服务器上进行验证。但是不先满足验证码就提交表单(按回车键)似乎不太合适。
    • @Miguel-F,当然。我只是从未见过这样做。我在提交任何内容之前验证空字段,并使用remote 方法验证用户对服务器的验证码响应。我从来不需要验证任何隐藏字段。
    • 我也从来不需要这样做。在测试期间,用户注意到他们可以通过简单地在字段中输入文本并按下回车键来绕过验证码(表单的提交按钮被禁用,直到验证码被满足 - 通过 JavaScript)。我的想法是,我需要将隐藏的 CAPTCHA 字段添加到验证逻辑中,以便在满足 CAPTCHA 之前无法提交表单。因此我的问题在这里。在初始测试期间,您上面的解决方案似乎对我有用。再次感谢!
    【解决方案2】:

    您必须自己触发“更改”事件以使验证代码重新运行。 Here is your fiddle with that change.

        $("#testhidden").val("sometext").trigger("change");
    

    【讨论】:

    • 感谢您的回复。我测试了你的小提琴,但在单击提交按钮之前我仍然看不到验证消息隐藏。我希望在通过 JavaScript 添加值后立即隐藏消息。有点像输入字符后验证消息如何隐藏在输入字段中。
    • @Miguel-F 这取决于验证插件 - 它可能会跟踪输入元素上的按键事件,但对于隐藏元素来说这样做没有多大意义。
    • 是的,我同意你的观点,我认为你在正确的轨道上触发了插件捕获的某种更改事件。我只是没能找到正确的。
    • @Miguel-F 我怀疑验证插件的作者并没有花很多时间考虑隐藏字段的行为,因为这些不是用户可以(轻松)更改的东西。告诉用户必须填写隐藏字段有点奇怪,但我知道在您的情况下它可能是由其他一些用户交互驱动的。
    • 是的,我知道我的用例以这种方式使用隐藏表单字段似乎有点奇怪。而且我同意验证插件通常不必自己处理隐藏字段。我的实际代码使用一种验证码,一旦用户通过它,它就会填充隐藏的表单字段。我只是想验证隐藏的表单字段,以便表单不会提交,除非它也已成功设置。
    【解决方案3】:

    为了让它在 jsfiddle 上工作,我将你隐藏输入的类型更改为简单的文本类型,并实际上添加了样式 visibility:hidden 以使其对用户不可见。使用这种方法,jquery 的验证插件将评估您的输入,即使它对用户是不可见的。

    <input type="text" style="visibility:hidden" id="testhidden" title="hidden field is required" name="testhidden" minlength="4" required="required" />
    

    希望这个答案能解决你的问题。

    【讨论】:

    • 这真是个 hack。
    • 我不确定谁投了反对票,因为这似乎是一个合法的选择。但是,在我的情况下,输入字段的生成超出了我的控制,并且被设置为隐藏类型(由另一个插件)。感谢您的回复。
    • 出于几个原因,我否决了它。主要原因是它是一个丑陋的 hack,它破坏了 HTML 的语义。另一个是它仍然需要一个事件触发器,但答案无法解决。
    • 确实这是一个快速破解。但是这个答案不需要手动触发验证事件,因为验证插件实际上会触发它。我想知道这种黑客如何破坏 HTML 语义(个人知识)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多