我有一个表单,我使用jQuery验证插件在客户端进行了验证。为简洁起见,我创建了一个简单的测试用例来显示我的问题。该表单具有单个文本输入字段和单个隐藏输入字段。通过JavaScript更新输入字段值后无法获得验证消息
<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个字符。我的警告是隐藏的领域正在通过JavaScript更新后,窗体已加载到DOM。
我创建了a fiddle to demonstrate my problem。对于这个测试,我添加了一个按钮来模拟我如何通过JavaScript修改隐藏的输入值。要测试这样做:
- 尝试提交表单而不输入任何文本。你应该得到2个验证错误。
- 接下来在文本输入框中输入文本,输入至少2个字符后,应该隐藏第一个验证消息。
- 如果您尝试提交此时仍然不会因为隐藏的字段要求。
- 接下来点击通过JavaScript添加值按钮。我正在警惕价值观的前后。在这一点上,一旦隐藏的字段有正确的数据,我希望验证消息被隐藏,但事实并非如此。
- 此时表单将提交,因为验证条件已满足,但错误消息仍显示。
一旦隐藏字段包含适当的文本,我该如何获得验证消息以隐藏?
这里是我使用上面的测试形式一起去了简单的验证电话:
$("#testform").validate({errorElement:"div",ignore:[]});
在它的事项,我使用jQuery 1.11.1和jQuery验证1.12.0
情况更新
虽然Pointy的回答并不能解决问题,但我认为他正在走向正确的道路。我需要一些方法来触发器更新隐藏字段后触发验证。现在我有updated my fiddle通过添加第二个输入文本字段。我也通过JavaScript更新这个输入字段。当我通过JavaScript更新后在这个新字段上触发blur()
事件时,它正确隐藏了验证消息。然而,在隐藏字段上做同样的事情仍然无效。它肯定与它是一个隐藏的领域有关......
我认为你已经有了解决方案,我喜欢它,因为它使用插件的内置功能。我知道我的用例似乎很奇怪,但正如我试图在另一条评论中解释的那样,实际情况是用户完成了更新隐藏字段的验证码。我需要与表单相同的验证,以便在表单可以提交之前验证CAPTCHA响应。希望这有助于解释它。感谢您的有用答案! – 2014-09-05 15:27:09
@ Miguel-F,我明白了。不过,我希望您的CAPTCHA正在服务器上进行评估,因为JavaScript很容易被用户绕过和操纵。 – Sparky 2014-09-05 15:31:31
绝对是!我也在服务器上验证。但是,如果没有首先满足验证码,提交表单(通过按回车键)似乎不正确。 – 2014-09-05 15:36:14