如果选中某些复选框,则 jquery 验证表单输入

Posted

技术标签:

【中文标题】如果选中某些复选框,则 jquery 验证表单输入【英文标题】:jquery validate form input if certain check boxes are checked 【发布时间】:2010-09-22 18:58:58 【问题描述】:

我有一个多部分表单,它在开头使用一些 jquery.validate 错误检查来获取基本用户信息,以查看字段是否已填写并且电子邮件地址是否有效。

下面有一系列复选框 (type_of_request) 用于新帐户、删除帐户、新软件等,它们在选中/取消选中时显示/隐藏这些表单元素。

只有当相应的 type_of_request 项目已被选中时,我才想验证表单上所需的部分。


更新信息


这是一个很好的解决方案,但似乎需要选定部分的所有子项。

典型的场景是 type_request 中的 email 和其他复选框都被选中:

   <div id="email" style="display: block;"> // shown because other has been selected in the type request
     <input id="email_new_account" class="sq-form-field" type="checkbox" value="0" name="q4836:q1"/> // not required
     <input id="email_new_account_name" class="sq-form-field" type="text" name="q4836:q2"/> // if email_new_account checked then make required
     <input id="email_new_account_access" class="sq-form-field" type="text" name="q4836:q2"/> // if email_new_account checked then make required
     <input id="email_new_account_manager" class="sq-form-field" type="text" name="q4836:q3"/> // if email_new_account checked then make required

     <input id="email_add_remove_access" class="sq-form-field" type="checkbox" value="0" name="q4837:q1"/> // not required
     <input id="email_add_remove_account_name" class="sq-form-field" type="text" name="q4837:q2"/> // if email_add_remove_access checked then make required
     <input id="email_add_access" class="sq-form-field" type="text" name="q4836:q2"/> // if email_add_remove_access checked then make required
     <input id="email_remove_access" class="sq-form-field" type="text" name="q4837:q3"/> // if email_add_remove_access checked then make required
   </div>
   <div id="other" style="display: block;"> // shown because other has been selected in the type request
     <input id="other_describe_request" class="sq-form-field" type="text" name="q4838:q1"/> // required because #other was checked in type request
     <input id="other_request_justification" class="sq-form-field" type="text" name="q48387:q2"/> // required because #other was checked in type request
   </div>

进一步阅读


我对此进行了进一步审查,发现可以将以下内容添加到输入项的类中

class="required:true, messages:required:'Please enter 
your email address'"

class="required:true, email:true, messages:required:'Please enter 
your email address', email:'Please enter a valid email address'"

但是当我添加时

class="required:'input[@name=other]:checked'" 

在http://jquery.bassistance.de 网站上进行了描述,但它不起作用。我是否需要更改语法才能使其正常工作?

【问题讨论】:

【参考方案1】:

假设您使用的是 jQuery validation plugin,您可以根据单击的复选框设置/清除必需/非必需部分中每个控件的类。

$(document).ready( function()  $('form').validate();  );

function init_validation(divName)

    $('div#' + divName).find('input').addClass( 'required' );
    $('div#inputs').children('div:not(#' + divName + ')')
                  .find('input')
                  .removeClass( 'required' );

html

<form>
<div>
  <input type='radio'
         id='new_account_radio'
         name='interface_selector'
         value='new_account'
         selected=true
         onclick='init_validation("new_account");' /> New Account

  <input type='radio'
         id='delete_account_radio'
         name='interface_selector'
         value='delete_account'
         onclick='init_validation("delete_account");' /> Delete Account

  <input type='radio'
         id='new_software_radio'
         name='interface_selector'
         value='new_software'
         onclick='init_validation("new_software");' /> New Software

</div>

<div id='inputs'>
   <div id='new_account'>
       <input type='text' id='new_account_name' class='required' />
   </div>

   <div id='delete_account'>
       <input type='text' id='delete_account_name' />
   </div>

   <div id='new_software'>
       <input type='text' id='new_software_name' />
   </div>
</div>
</form>

【讨论】:

不知道为什么语法高亮似乎不适用于所有这些。 谢谢,这有点偏离我的需要,所以我更新了原始问题以尝试更清楚一点。 @tvanfosson:“语法高亮似乎不起作用” - 因为您从 javascript 开始, / 使它认为它正在做一个正则表达式。【参考方案2】:

我最终采用的解决方案是从 http://bassistance.de/jquery-plugins/jquery-plugin-validation/ 链接 jquery.validate.js 和 jquery.metadata.js

然后我在表单顶部有一个请求类型检查列表,当您检查项目时显示/隐藏 id 元素(显示/隐藏功能未显示)。

<fieldset id="request-type">
<legend>Type of Request</legend>
<ul>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_0" value="0"  class="sq-form-field" /><label for="q4838_q1_0">New account</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_1" value="1"  class="sq-form-field" /><label for="q4838_q1_1">Delete account</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_2" value="2"  class="sq-form-field" /><label for="q4838_q1_2">Change access/account transfer</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_3" value="3"  class="sq-form-field" /><label for="q4838_q1_3">Hardware</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_4" value="4"  class="sq-form-field" /><label for="q4838_q1_4">Software</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_5" value="5"  class="sq-form-field" /><label for="q4838_q1_5">Email</label></li>
<li><input type="checkbox" name="q4838:q1[]" id="q4838_q1_6" value="6"  class="sq-form-field" /><label for="q4838_q1_6">Other</label></li>
</ul>
</fieldset>

对于这个例子,我们会说“删除帐户”已被选中,这将“显示”

<fieldset id="delete-account" style="display: block;">

因为选中删除帐户选项时,字段集中的两个输入字段都是必需的,所以我已将以下内容添加到所需输入的类属性中。

class="required:'#checkboxid:checked', messages:required:'required error message'"

“删除帐户”字段集如下所示.....

<fieldset id="delete-account" style="display: block;">
<legend>Delete Account</legend>

<label  for="q4832_q1">Cessation date</label>
<input type="text" name="q4832:q1value[d]" value="" class="required:'#q4838_q1_1:checked', messages:required:'Enter Cessation Date'" id="q4832:q1value[d]" />

<label  for="q4832_q1">List of assets</label>
<input type="text" name="q4832:q2" value="" class="required:'#q4838_q1_1:checked', messages:required:'Enter Cessation Date'" id="q4832:q2" />
</fieldset>

类中的“必需”值通常适用于真或假,即required:'true', messages:required:'This field is required',但在这种情况下,我们在其中放置一个引用而不是标准的真或假#checkboxid:checked。如果选中,则返回为'true',并且该字段成为必填字段,如果返回'false',则不需要该字段。

我发现另一件有用的事情是通过在每个复选框的 class 属性中添加以下内容来确保有人在表单的开头选择了请求类型

class="required:'true', minlength:1, messages:required:'Please select a checkbox'"

如果您需要多于一个复选框,则只需添加到最小长度。

【讨论】:

以上是关于如果选中某些复选框,则 jquery 验证表单输入的主要内容,如果未能解决你的问题,请参考以下文章

如果选中相邻复选框,则输入字段验证

如果选中复选框,则打开输入文本(JQuery)

如何使用表单验证 jquery 检查至少一个选中的复选框?

如果选中任一复选框,则启用和禁用文本字段

如果选中复选框,则 Laravel 存储值

Angular 反应式表单自定义验证器。仅在选中复选框时启用验证