【问题标题】:jQuery validation with unknown array key使用未知数组键的 jQuery 验证
【发布时间】:2013-03-12 13:44:57
【问题描述】:

查看这里的文档: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 = '<p><input type="file" name="field['+key+']"></p>';
    $('div#inputcontainer').append(data);
 });

示例 HTML 输出:

<p><input name="field[19]" type="file"></p>
<p><input name="field[22]" type="file"></p>
<p><input name="field[25]" type="file"></p>

我尝试过这样定义规则:

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

(取自这个答案:jquery validate add rules for an array input 编辑:这种使用'field[]' 设置规则的建议方法不适用于验证插件。请参阅下面的答案和 cmets。)

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

【问题讨论】:

  • 据我记得,jQuery.validate 不支持验证具有相同名称的多个字段,即使您删除括号之间的数字(您可以在发送到大多数后端语言)。尝试使用$('input').rules("add", { required:true, extension: "pdf|docx?" })
  • 谢谢!输入字段是动态添加的,因此我无法使用您的建议,因为输入不在 DOM 中。此外,我使用数组键来跟踪表单中的许多内容,所以我不能只设置 name="field[]" 这将与验证一起使用......
  • 对每个动态生成的字段使用.rules("add", {})。没有其他选项不涉及更丑陋的黑客攻击。
  • 谢谢。有效。添加为您的答案,我会接受。我的解决方案是为每个动态添加的输入字段添加规则:$('input[name="field['+key+']"]').rules("add", { required:true, extension: "pdf|doc|docx" });key 是我的数字变量...)

标签: jquery jquery-validate


【解决方案1】:

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

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

jQuery.validate 确实提供了一种通过表单上设置的规则(至少到 v1.11)来验证同名元素(foo[]foo[N])的方法。

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

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


注意给未来的读者:.rules('add')addClassRules 都不适用于重复名称(例如 foo[]),但如果名称不完全相同(例如 @ 987654337@),这是 OP 的情况。

我相信具有完全相同名称的输入对于这个问题来说是题外话,但是对于这些你要么必须使用addMethod 添加自己的验证方法,或者在表单的提交处理程序中添加你自己的验证,或者试试这个@ 987654324@.

【讨论】:

  • @jtheman 在正则表达式中,? 使其前面的字符成为可选字符。
  • 是的,我知道设置class="required",我也在考虑使用addMethod() 添加自定义方法来验证扩展的解决方案。应该也可以吧?
  • @jtheman 是的,这是可能的。如果您需要一些自定义验证,=]addMethod 非常方便。
  • @jtheman 是的,我从来没有使用过那种语法。它给人一种它正在工作的错误印象,因为验证会选择第一个元素,但如果您有多个同名元素,则不会选择其余元素。
  • @jtheman,是的,一般来说“变色龙问题”是一种不好的做法。但是,在这种情况下,最好将您的适度澄清编辑到您的问题中,而不是将它们放在 cmets 中。否则,一个答案可能比另一个与您的 OP 更相关的答案更能解决您的问题。
【解决方案2】:

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

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

html

<input name="field[19]" type="file" class="myinput"> 
<input name="field[22]" type="file" class="myinput"> 
<input name="field[25]" type="file" class="myinput">

【讨论】:

  • 谢谢,这正是我最初想要的!但是现在我坚持以前的解决方案(没有人付钱让我再次更改它......):D +1 给你!
【解决方案3】:

编辑:我的答案发布在问题的原始版本中,在没有阅读 cmets 的情况下,不知道这些字段是动态创建的。否则,最好在创建每个字段时简单地添加规则:

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 = '<p><input type="file" name="field['+key+']"></p>';
    $('div#inputcontainer').append(data);
    $('[name="field['+key+']"]').rules("add", myRule); // add the rule to the new field
});

(嵌套括号处理as per this answer。)

原答案如下:


接受的答案让你成功了一半。

另外,我的回答不需要额外的class 或对现有 HTML 结构的任何其他更改。这都是 jQuery...

前半部分使用the built-in rules('add') method

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

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

您只需使用 jQuery .each()jQuery "starts with" selector

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

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

【讨论】:

  • 记住字段是动态添加的。有了这个,如果您打算在添加输入时使用此代码,您将多次查询 DOM,而不必要地重新添加这些元素已经存在的规则。
  • @FabrícioMatté,你是对的。但是,我的回答仅适用于目前编写的 OP。如果 OP 可以显示实际添加该字段的代码,也许可以提供更好的答案。
  • 是的,您的回答可以帮助未来访问者遇到与提问者代码类似的问题。至于 OP 具​​有的动态生成的输入,只需将循环替换为将.rules('add') 应用于每个生成的输入即可。
  • @jtheman,我很高兴你明白了。在您接受另一个答案之后,我发布了我的答案,主要是为临时读者提供服务,他们可能只是按照书面形式接受 OP,而不阅读 cmets。谢谢!
  • @jtheman,本着同样的精神,我编辑了我的答案,使其更符合您的具体情况。
猜你喜欢
  • 2021-10-10
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2017-05-28
  • 1970-01-01
相关资源
最近更新 更多