使用未知数组键进行jQueryvalidation

查看此处的文档: http : //docs.jquery.com/Plugins/Validation/Reference#Fields_with_complex_names_.28brackets.2C_dots.29将规则附加到输入数组的语法如下所示:

rules: { "user[email]": "email", 

但是在我的情况下,数组键是数字值,可以有任何值,但我仍然想将规则附加到字段。 我用jQuery动态添加输入字段( key是一个全局变量):

  $('a#addfield').click(function(e) { e.preventDefault(); var data = '

'; $('div#inputcontainer').append(data); });

示例HTML输出:

 

我试过定义这样的规则:

 rules: { 'field[]': { required: true, extension: "pdf|doc|docx" } } 

(取自这个答案: jquery validate为数组输入添加规则 编辑:这种使用'field[]'设置规则'field[]'方法不适用于validation插件。请参阅下面的答案和评论。)

但是当我尝试添加其他文件类型时没有validation错误…有什么建议吗?

您可以将.rules("add", rules)应用于每个生成的元素:

 $(element).rules("add", { required:true, extension: "pdf|docx?" }); 

jQuery.validate确实提供了一种方法来validation具有相同名称的元素( foo[]foo[N] )通过表单上设置的规则(至少高达v1.11)。

还有其他一些添加动态规则的方法,例如,在不调用.rules('add')情况下添加所需的检查,你可以在元素中使用class="required" ,validation插件应该动态地选择它。

但是,没有与extension选项等效的内置函数,因此您必须向所有输入添加一个类,并使用addClassRules创建自己的类规则。 这最终会混淆一些行为与HTML和可能的CSS。


注意未来的读者: .rules('add')addClassRules都不适用于重复的名称(例如foo[] )但是如果名称不完全相同(例如foo[index] )这些是OP的情况下它们可以工作。

我认为具有完全相同名称的输入对于这个问题是偏离主题的,但是对于这些,您必须使用addMethod添加自己的validation方法,或者在表单的提交处理程序中添加您自己的validation或尝试此相关答案 。

我认为给出的答案是对的,但是也值得考虑创建一个结合了你的两个规则的类规则,然后给你的输入这个类。 这样,每次动态向DOM添加新元素时都不必调用addMethod。

 $.validator.addClassRules("myinput", { required:true, extension: "pdf|docx?" }); 

HTML

    

编辑 :我的答案发布在问题的原始版本,没有阅读评论,不知道这些字段是动态创建的。 否则,在创建每个字段时,可能更喜欢简单地添加规则:

 var myRule = { // save some code... put the common rule into a variable required:true, extension: "pdf|docx?" }; $('a#addfield').click(function(e) { e.preventDefault(); var data = '

'; $('div#inputcontainer').append(data); $('[name="field['+key+']"]').rules("add", myRule); // add the rule to the new field });

( 按照这个答案处理嵌套括号。)

原始答案如下:


接受的答案让你半途而废。

此外,我的答案不需要对现有HTML结构进行额外的class或任何其他更改。 这都是jQuery ……

上半部分是使用内置rules('add')方法 。

 $(element).rules("add", { required:true, extension: "pdf|docx?" }); 

下半部分是将该方法应用于名为"field[19]""field[20]""field[21]"等所有元素。

您只需使用带有jQuery“starts with”选择器的jQuery .each()

 $('[name^="field"]').each(function() { $(this).rules("add", { required:true, extension: "pdf|docx?" }); }); 

演示: http : //jsfiddle.net/cWABL/