【问题标题】:How to validate two check boxes and make sure that at least one is checked?如何验证两个复选框并确保至少选中一个?
【发布时间】:2018-10-03 17:24:04
【问题描述】:

我的表单中有两个复选框,所有其他表单字段都使用必需的 HTML5 属性,因此我可以在提交时运行验证。这有点不同,因为我有两个复选框输入字段,并且我必须要求至少一个被选中。这是一个例子:

$('.frm-Submit').on('submit', submitFrm);
function submitFrm(e){
    e.preventDefault(); // Prevnts default form submit.
    var $checkbox = $('.account-type');

    $checkbox.on('change', function(){
        var checked = false;
  
        $checkbox.each(function(){
           checked = checked || $(this).is(':checked')
        });
  
        $checkbox.prop('required', !checked)
    });

    console.log('Submit form.')
}
.form-group.required .control-label:after {
    content: " *";
    color: red;
}
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<form name="frmSave" id="frmSave" class="frm-Submit" autocomplete="off">
  <div class="form-group required">
    <label class="control-label" for="account"><span class="label label-primary">Account Type:</span></label>
    <div class="checkbox">
      <label for="user">
         <input type="checkbox" name="frm_isuser" id="frm_isuser" data-toggle="collapse" data-target="#user-account" required class="account-type"> <span class="label label-default">User</span>
      </label>
      <label for="staff">
         <input type="checkbox" name="frm_isstaff" id="frm_isstaff" data-toggle="collapse" data-target="#staff-account" required class="account-type"> <span class="label label-info">Staff</span>
      </label>
    </div>
  </div>
   <div class="row">
     <div class="form-group col-xs-12 col-sm-12 col-md-1 col-lg-1">
       <button type="submit" name="frm_submit" id="frm_submit" class="btn btn-primary">Submit</button>
     </div>
   </div> 
</form>

上面的示例抛出错误isUser.checkValidity() is not a function。有没有办法在复选框上运行有效性并至少使两个必需/选中之一?

【问题讨论】:

    标签: javascript jquery html html5-validation checkvalidity


    【解决方案1】:

    $("#frm_isuser").is(":checked") 将返回一个布尔值,显示 $("#frm_isuser") 是否被选中。

    checkValidity()是一个DOM方法,所以你应该使用document.getElementById("frm_isuser").checkValidity()$("#frm_isuser")[0].checkValidity()

    编辑:如果选中两个复选框之一,则将required 属性设置为false 给它们。如果都没有选中,则将required 设置为true

    $('.frm-Submit').on('submit', submitFrm);
    
    var $checkbox = $('.custom-class')
    
    $checkbox.on('change', function(){
      var checked = false;
      
      $checkbox.each(function(){
        checked = checked || $(this).is(':checked')
      })
      
      $checkbox.prop('required', !checked)
    })
    
    function submitFrm(e) {
      e.preventDefault(); // Prevnts default form submit.
      
      console.log('Submit form.')
    }
    .form-group.required .control-label:after {
      content: " *";
      color: red;
    }
    <script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    
    <form name="frmSave" id="frmSave" class="frm-Submit" autocomplete="off">
      <div class="form-group required">
        <label class="control-label" for="account"><span class="label label-primary">Account Type:</span></label>
        <div class="checkbox">
          <label for="user">
             <input type="checkbox" name="frm_isuser" id="frm_isuser" data-toggle="collapse" data-target="#user-account" required class="custom-class"> <span class="label label-default">User</span>
          </label>
          <label for="staff">
             <input type="checkbox" name="frm_isstaff" id="frm_isstaff" data-toggle="collapse" data-target="#staff-account" required class="custom-class"> <span class="label label-info">Staff</span>
          </label>
        </div>
      </div>
      <div class="row">
        <div class="form-group col-xs-12 col-sm-12 col-md-1 col-lg-1">
          <button type="submit" name="frm_submit" id="frm_submit" class="btn btn-primary">Submit</button>
        </div>
      </div>
    </form>

    【讨论】:

    • 如果我点击提交并且两个复选框都未选中,我看不到 HTML5 验证消息。
    • 因为您没有将required 属性添加到复选框。现在我更新了 sn-p。
    • 再一次,我不想同时要求这两个,我只需要至少一个被检查。所以必须检查用户或员工。
    • 请检查我上面的 sn-p,我使用了相同的代码,但仍然需要两个复选框。
    • 你必须在submitFrm函数之外进行更改事件,否则它会先检查是否需要。所以取出 change 事件,它会在选中或取消选中复选框时触发。
    【解决方案2】:

    像这样添加,

    $(function(){
    	
    	$('[type="checkbox"]').prop('required', true);
    	$('[type="checkbox"]').filter('[required]').change(function(){
    		$('[type="checkbox"]').prop('required', ($(this).is(':checked')) ? false : true);
    	})
    	$('.frm-Submit').on('submit', function(e){
            e.preventDefault(); // Prevnts default form submit.		
            if($('[type="checkbox"]:checked').length > 0){			
                console.log('Submit form.')
            }else{
    			$(this).closest('form').get(0).checkValidity();
    		}
        });
    	
    });
    <script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    
    <form name="frmSave" id="frmSave" class="frm-Submit" autocomplete="off">
      <div class="form-group required">
        <label class="control-label" for="account"><span class="label label-primary">Account Type:</span></label>
        <div class="checkbox">
          <label for="user">
             <input type="checkbox" name="frm_isuser" id="frm_isuser" data-toggle="collapse" data-target="#user-account"> <span class="label label-default">User</span>
          </label>
          <label for="staff">
             <input type="checkbox" name="frm_isstaff" id="frm_isstaff" data-toggle="collapse" data-target="#staff-account"> <span class="label label-info">Staff</span>
          </label>
        </div>
      </div>
       <div class="row">
         <div class="form-group col-xs-12 col-sm-12 col-md-1 col-lg-1">
           <button type="submit" name="frm_submit" id="frm_submit" class="btn btn-primary">Submit</button>
         </div>
       </div> 
    </form>

    【讨论】:

    • 如果两个复选框都未选中,我需要 HTML5 验证消息。
    • @espresso_coffee,现在检查,我已经更新了答案
    • 我仍然有两个复选框都需要的问题。不知道为什么......你可以检查我上面的sn-p。
    • 至少要选中一个复选框。
    • 是的,我的回答就像你要求的那样工作......运行代码 sn-p 并检查,我已经更新了
    【解决方案3】:

    .is(":checked") 已经返回 boolean...没有 .checkValidity() 方法。做吧:

    if (isUser || isStaff) {
      //...code here if at least one is true
    }
    

    更新:

    在这种情况下,您需要的需求和验证本质上是两组独立的逻辑。

    Constraint validation 以每个输入为基础运行,因此您必须自己检查多个输入。

    您可以选择通过侦听每个复选框上的事件来交换required 参数的值...但由于它们似乎具有不同的data-target,我认为更好的解决方案可能只是使用选择表单类型。

    【讨论】:

    • 如果两个复选框都未选中,我想显示 HTML5 验证消息。
    • 更新了我的回复,更多地解释了checkValidity 的工作原理,但您可以查看@Hikarunomemory 的答案,了解如何交换required 可以获得您想要的结果。
    猜你喜欢
    • 2017-07-27
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2015-11-06
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多