2014-09-05 35 views
1

我有一个表单,我使用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修改隐藏的输入值。要测试这样做:

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

一旦隐藏字段包含适当的文本,我该如何获得验证消息以隐藏?

这里是我使用上面的测试形式一起去了简单的验证电话:

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

在它的事项,我使用jQuery 1.11.1和jQuery验证1.12.0

情况

更新

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

回答

2

报价OP

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

该插件提供a method called .valid()在其唯一目的就是以编程方式触发验证,无论是在单场或整个形式。

”这肯定有事情做同在一处隐藏字段”

常规输入字段的验证通常是由事件如KEYUP触发和模糊。既然你没有对这些事件隐藏字段,您只需使用.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()); 
}); 

DEMO:http://jsfiddle.net/opzg6uxn/2/


但是,我不明白为什么你需要验证超出用户控制范围的内容。换句话说,由于隐藏字段是以编程方式控制的,所以首先对其应用验证有什么意义?

+1

我认为你已经有了解决方案,我喜欢它,因为它使用插件的内置功能。我知道我的用例似乎很奇怪,但正如我试图在另一条评论中解释的那样,实际情况是用户完成了更新隐藏字段的验证码。我需要与表单相同的验证,以便在表单可以提交之前验证CAPTCHA响应。希望这有助于解释它。感谢您的有用答案! – 2014-09-05 15:27:09

+0

@ Miguel-F,我明白了。不过,我希望您的CAPTCHA正在服务器上进行评估,因为JavaScript很容易被用户绕过和操纵。 – Sparky 2014-09-05 15:31:31

+0

绝对是!我也在服务器上验证。但是,如果没有首先满足验证码,提交表单(通过按回车键)似乎不正确。 – 2014-09-05 15:36:14

1

你必须自己触发“更改”事件才能导致验证码重新运行。 Here is your fiddle with that change.

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

感谢您的回复。我测试了你的小提琴,但直到点击提交按钮后,我仍然看不到验证信息。我希望在通过JavaScript添加值之后隐藏消息。有点像验证邮件在输入字符后在输入字段中的隐藏方式。 – 2014-09-05 13:43:44

+0

@ Miguel-F那么这取决于验证插件 - 它可能会跟踪输入元素上的按键事件,但对于隐藏元素来说,这样做没有多大意义。 – Pointy 2014-09-05 13:46:51

+0

是的,我同意你的看法,我认为你在正确的轨道上触发插件的某种变化事件。我只是无法找到正确的。 – 2014-09-05 13:48:49

-1

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

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

希望这个答案是你的问题。

+0

这是相当黑客。 – Sparky 2014-09-05 15:29:17

+0

我不确定是谁投了票,因为这似乎是一个合法的选择。然而,在我的情况下,输入字段的生成超出了我的控制范围,并被设置为隐藏类型(由另一个插件)。感谢您的回应。 – 2014-09-05 15:34:32

+0

我投了反对票有几个原因。主要原因是,这是一个丑陋的黑客,与HTML的语义螺丝。另一个问题是,它仍然需要一个事件触发器,该答案无法解决。 – Sparky 2014-09-05 18:02:53