如何validation具有多个checkbox的表单以检查至less一个

我试图validation一个窗体使用jQuery的validation插件。 我想要求用户至less检查一个组中的一个checkbox,以便提交表单。 这是我的jQuery代码:

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

这里是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"> 

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

下面这个脚本应该把你放在正确的轨道上吗?

你可以保持这个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> 

和这个JavaScriptvalidation

 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) 

你可以在这里find一个工作的例子

更新(2012年10月)
另外应该注意的是checkbox必须有一个“名称”属性,否则它们将不会被添加到数组中。 只有“ID”才会起作用。

更新(2013年5月)
将提交注册移至javascript并将提交注册到表单上(原本应该是这样的)

更新(2016年6月)
将==更改为===

  $('#subscribeForm').validate( { rules: { list: { required: true, minlength: 1 } } }); 

我认为这将确保至less有一个被检查。

这个怎么样:

 $(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 } }); }); 

上述罗德·劳森的addMethod并不完全正确。 它是$ .validator而不是$ .validate,validation器方法名称cb_selectone需要引号。 这是我testing的一个更正的版本:

 $.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'); 

以下是使用jQueryvalidation插件进行多重checkboxvalidation的快速解决scheme:

 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(); }); 

这个怎么样

 $.validate.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 a least one') 

现在你可以做了

 $.validate({rules:{checklist:"cb_selectone"}}); 

你甚至可以进一步指定在callback函数中的第三个参数select的最小数量。我还没有testing过,所以告诉我,如果它的工作。

很好的例子没有自定义validation方法,但与元数据插件和一些额外的HTML。

来自Jquery.Validate插件作者的演示

我必须做同样的事情,这就是我写的。我在这个例子中使得它更加灵活,因为我有多组checkbox要检查。

 // param: reqNum number of checkboxes to select $.fn.checkboxValidate = function(reqNum){ var fields = this.serializeArray(); return (fields.length < reqNum) ? 'invalid' : 'valid'; } 

那么你可以通过这个函数来检查具有多个规则的多组checkbox。

 // helper function to create error function err(msg){ alert("Please select a " + msg + " preference."); } $('#reg').submit(function(e){ //needs at lease 2 checkboxes to be selected if($("input.region, input.music").checkboxValidate(2) == 'invalid'){ err("Region and Music"); } }); 

我有一个轻微的不同的情况。 我的checkbox是dynamic创build的,它们不是同一个组。 但至less他们中的任何一个都必须检查。 我的方法(不要说这是完美的),我为他们创build了一个genricvalidation器:

 jQuery.validator.addMethod("validatorName", function(value, element) { if (($('input:checkbox[name=chkBox1]:checked').val() == "Val1") || ($('input:checkbox[name=chkBox2]:checked').val() == "Val2") || ($('input:checkbox[name=chkBox3]:checked').val() == "Val3")) { return true; } else { return false; } }, "Please Select any one value"); 

现在我不得不将每个chkbox关联到这个单一的validation器。

当我点击任何checkbox触发validation器时,我也必须触发validation。

 $('#piRequest input:checkbox[name=chkBox1]').click(function(e){ $("#myform").valid(); }); 
 if ( document.forms["form"]["mon"].checked==false && document.forms["form"]["tues"].checked==false && document.forms["form"]["wed"].checked==false && document.forms["form"]["thrs"].checked==false && document.forms["form"]["fri"].checked==false ) { alert("Select at least One Day into Five Days"); return false; }