2

我有一个动态表单,用户可以在其中添加多个选择框:

<form id="ticket_form">
  <select class="required" name="quantity[1]"></select>
  <select class="required" name="quantity[2]"></select>
  <select class="required" name="quantity[3]"></select>
</form>

目前,我确保用户为每个选择框选择了一个值:

$("#ticket_form").validate({
  rules: {
    'quantity[]': 'required'
  },
  messages: {
    'quantity[]': 'This field is whack'
  }
});

我实际上只需要其中一个来具有选定的值。当至少一个选择框有值时,我应该怎么做才能让验证通过?

更新

这是我最终根据 Ben Barden 的解决方案解决我的问题的代码:

$.validator.addMethod("groupSelect", (function(value, element, isRunning) {
  return $(".required[value!=\"\"]").length > 0;
}), "At least one must be selected.");

我还在该类中添加了一个额外的类规则required,因此我不必再向实际的验证规则添加任何内容:

$.validator.addClassRules({
  'required': {
    'groupSelect': true
  }
});
4

3 回答 3

2

为此,您几乎必须创建自己的验证规则,但您需要的规则非常简单。该类的所有成员都将验证是否存在该类的任何成员,其值不是默认值。因此,您使用类选择器,然后通过值不等于选择器进一步过滤,并检查结果是否包含任何内容。

    jQuery.validator.addMethod(
    "groupSelect",
    function (value, element, isRunning)
    {
        return $('.groupSelectClass[value!="defaultSelectValue"]').length > 0;
    },
    "At least one must be selected.");

然后只需将groupSelect规则(写在那里的规则)应用于groupSelectClass类(确保在生成时将其添加到所有选择器)并确保您所取代的defaultSelectValue实际上是选择器的默认值。请注意,这一切都需要在基本validate调用之前设置,而不是之后。

编辑:

进一步解释:上面的代码块通过名称groupSelect(或您放在那里的任何内容)定义了一个验证规则。如所写,groupSelect当且仅当至少一个具有类“groupSelectClass”的节点具有除“defaultSelectValue”之外的某个值时,该规则才返回有效。如果您确保具有“groupSelectClass”类的所有内容都是默认值为“defaultSelectValue”的选择框,则当且仅当至少设置了这些选择框之一时,此规则才会返回有效。如果您随后使用该函数将此规则应用于“groupSelect”类jQuery.validator.addClassRules,它将导致所有这些选择框都将其作为验证要求,并显示“必须选择至少一个”。关于验证失败。 http://docs.jquery.com/Plugins/Validation/Validator/addClassRules应该让您对如何使用 addClassRules 函数有足够的了解。事实上,我建议您阅读该站点中的一般内容,特别是验证插件信息,如果您打算使用它做很多事情的话。

于 2012-12-05T13:57:21.917 回答
0

我有一个检查这个的功能,但这是一个非 .validate() 方法

function CheckValue(){
    var oneSelected = false;


     $('#ticket_form select').each(function(k,v){

          // this assumes that zero is an unselected index 
          if($(v).children('option:selected').val() != 0){

             oneSelected = true;

           }

     });

     return oneSelected;
}
于 2012-12-05T13:56:29.913 回答
0
var index = [];

$('.required').each(function(i) {
    if ($(this).val() != null) { // Check for null or undefined if not proceed
        index.push(i);
    }
});

index 现在为具有值的选择框提供了一组索引。使用 using 访问它们index[0],其中 0 是第一个匹配的带有值的选择。

var selectVal = $('.required').eq(index[0]).val();
于 2012-12-05T14:03:14.453 回答