如何验证具有多个复选框的表单以检查至少一个

jal*_*rin 40 html javascript checkbox jquery-validate

我正在尝试使用jquery的validate插件验证表单.我想要求用户检查组中的至少一个复选框,以便提交表单.这是我的jquery代码:

$().ready(function() {
$("#subscribeForm").validate({
   rules:   { list: {required: "#list0:checked"} },
   messages:  { list:  "Please select at least one newsletter"}                                                        
 });
 });
Run Code Online (Sandbox Code Playgroud)

这是html表单:

<form action="" method="GET" id="subscribeForm">
<fieldset id="cbgroup">
    <div><input name="list" id="list0" type="checkbox"  value="newsletter0" >zero</div>
    <div><input name="list" id="list1" type="checkbox"  value="newsletter1" >one</div>
    <div><input name="list" id="list2" type="checkbox"  value="newsletter2" >two</div>
</fieldset>
<input name="submit" type="submit"  value="submit">
Run Code Online (Sandbox Code Playgroud)

问题是即使没有检查任何内容,表单也会提交.我该如何解决这个问题?

小智 52

  $('#subscribeForm').validate( {
      rules: {
          list: {
              required: true,
              minlength: 1
          }
       }
   });
Run Code Online (Sandbox Code Playgroud)

我认为这将确保至少有一个被检查.


dan*_*ano 30

下面这个脚本应该让你走上正确的轨道?

你可以保持这个html相同(虽然我将方法更改为POST):

<form method="POST" id="subscribeForm">
    <fieldset id="cbgroup">
        <div><input name="list" id="list0" type="checkbox"  value="newsletter0" >zero</div>
        <div><input name="list" id="list1" type="checkbox"  value="newsletter1" >one</div>
        <div><input name="list" id="list2" type="checkbox"  value="newsletter2" >two</div>
    </fieldset>
    <input name="submit" type="submit"  value="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

这个javascript验证

function onSubmit() 
{ 
    var fields = $("input[name='list']").serializeArray(); 
    if (fields.length === 0) 
    { 
        alert('nothing selected'); 
        // cancel submit
        return false;
    } 
    else 
    { 
        alert(fields.length + " items selected"); 
    }
}

// register event on form, not submit button
$('#subscribeForm').submit(onSubmit)
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到一个有效的例子

更新(2012年10月)
此外,应注意复选框必须具有"名称"属性,否则它们将不会添加到数组中.只有"id"才行.

更新(2013年5月)
将提交注册移至javascript并将提交注册到表单上(因为它本来应该是)

更新(2016年6月)
更改==至===

  • 啊,我想通过在"required:"rules参数中替换"input [name ='list']"来实现它.所以,我的jquery"规则"现在看起来像这样:rules:{list:{required:"input [name ='list']",minlength:1}}, (7认同)
  • 为什么使用`onsubmit`(在按钮而不是表单上,不能少!)而不是`$('form').submit(function(){...})`? (6认同)

JJ *_*wax 11

这个怎么样:

$(document).ready(function() {
    $('#subscribeForm').submit(function() {
        var $fields = $(this).find('input[name="list"]:checked');
        if (!$fields.length) {
            alert('You must check at least one box!');
            return false; // The form will *not* submit
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 但是没有使用OP请求的jQuery Validate插件. (3认同)

Ste*_*row 9

Lod Lawson的上述addMethod并不完全正确.它是$ .validator而不是$ .validate,验证器方法名称cb_selectone需要引号.这是我测试的更正版本:

$.validator.addMethod('cb_selectone', function(value,element){
    if(element.length>0){
        for(var i=0;i<element.length;i++){
            if($(element[i]).val('checked')) return true;
        }
        return false;
    }
    return false;
}, 'Please select at least one option');
Run Code Online (Sandbox Code Playgroud)


ale*_*ely 6

以下是使用jquery验证插件进行多个复选框验证的快速解决方案:

jQuery.validator.addMethod('atLeastOneChecked', function(value, element) {
  return ($('.cbgroup input:checked').length > 0);
});

$('#subscribeForm').validate({
  rules: {
    list0: { atLeastOneChecked: true }
  },
  messages: {
    list0: { 'Please check at least one option' }
  }
});

$('.cbgroup input').click(function() {
  $('#list0').valid();
});
Run Code Online (Sandbox Code Playgroud)