jQuery验证动态输入数组

时间:2013-02-18 18:38:19

标签: jquery jquery-validate

如果这是一个动态数组,如何验证<select>?像这样:

<select class="escolhaVidro id_material" name="id_material[]" id="id_material">

澄清:这个<select>由PHP动态组合,所以我不知道索引是什么,所以这种方式是不可能的:

$(this).validate({
    rules: {
        "id_material[index]" : {
            required : true
        }
    }
});

奇怪的是这个插件不起作用:

$(this).validate({
    rules: {
        id_material : {
            required : true
        }
    }
});

我还尝试在class中使用CSS required <select>,但没有用。

2 个答案:

答案 0 :(得分:11)

  

引用OP :“奇怪的是这个插件不起作用:
  $(this).validate({ ... });

这并不奇怪。它没有用,因为你没有真正针对任何东西。 $(this)没有任何意义的背景或范围。

您必须正确定位<form>元素:

例如,id ...

$('#myform').validate({ ... });

...或any other valid jQuery selector定位您要验证的实际<form></form>


以下是如何验证您可以轻松适应您的情况的select元素的一般示例:

<强> http://jsfiddle.net/Gy24q/

重要option元素中的第一个或默认select必须包含value=""或{{ 1}}规则将失败。如果出于某种原因,您无法将此required的{​​{1}} option设置为value,那么see this answer's自定义方法解决方法和jsFiddle

<强> HTML

""

由于您的<form id="myform"> <select name="id_material[]"> <option value="">please choose...</option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> .... </form> 包含括号,nameyou also must enclose your field name in quotes

<强>的jQuery

[]

上面的答案假设您知道$(document).ready(function () { $('#myform').validate({ // initialize plugin within DOM ready // other options, rules: { 'id_material[]': { required: true } }, }); }); 元素的name。但是,如果你不知道select,你有两个选择......

1)name元素中使用class="required" ...

select

演示:http://jsfiddle.net/Gy24q/4/

2)如果规则较为复杂,您可以使用the rules('add') method根据现有<select class="escolhaVidro id_material required" name="id_material[]" id="id_material"> 作业添加复合rules

如果您有多个需要此规则的class元素,请使用jQuery .each() ...

select

演示:http://jsfiddle.net/Gy24q/10/

否则,这只会​​将规则应用于只有一个带有// must be called after validate() $('select.id_material').each(function () { $(this).rules('add', { required: true }); }); select class元素...

id_material

修改

在评论中引用OP:

  

执行验证后的函数内部:   $('select.id_material').rules('add', { required: true }); 然后   $('#formOrcamento').live('submit', function() {...});指的是:$(this).validate({...});

同样如下:

$('#formOrcamento').validate
  ({...});

是的,这正是它被打破的原因。

.validate()只能在DOM上调用一次,准备初始化插件。你不应该把它放在$('#formOrcamento').live('submit', function() { $(this).validate({ ... }); }); 处理程序中。 Validate插件已经有了自己的内置事件处理程序,可以捕获表单的提交按钮。

根据我上面的jsFiddle演示设置您的代码。


编辑2:

在评论中引用OP:

  

我正在使用submit,这会增加选择以下内容:   jquery-ui。如果我通过Firebug移除style='display: none',   然后选择验证并正确显示标签错误。   可能会发生什么?

默认情况下,Validate插件会忽略隐藏的元素。您需要通过将display: none添加到ignore: []来关闭该选项:

validate()

有关详细信息,请参阅this answer

答案 1 :(得分:-1)

只需使用emtpy括号,并确保包含括号的名称带引号(请参阅documentation):

$(this).validate({
    rules: {
        "id_material[]" : {
            required : true
        }
    }
});