将jQuery Validation插件中的validation方法与“或”而不是“和”相结合

在jQuery Validation插件中有几种方法可以做同样的事情,但对于不同的语言环境,例如dateISOdateDE ,它们都validation了日期格式。 我如何组合这些,以便输入元素接受?

假设我的表单中有 ,我想允许用户只在此字段中输入日期。 但是,我想允许几种不同的日期格式 – 例如,用户应该能够输入ISO日期根据德国日期规则格式化的日期。

如果我做

 rules: { dateInput: { required: true, dateISO: true, dateDE: true } } 

表格将永远无效,因为两种日期格式都是必需的,并且永远无法满足该要求。 有没有办法将这些组合为“或”而不是“和”,而不必编写我自己的validation方法?

如果我必须自己编写,我该如何使它尽可能通用?

虽然你可以像Reigel那样组合正则表达式,你也可以直接调用这些方法(如果它们改变了!),如下所示:

 $.validator.addMethod("dateISODE", function(value, element) { return $.validator.methods.dateISO.apply(this, arguments) || $.validator.methods.date.apply(this, arguments); }, "Please enter a valid ISO or German date"); 

现在我在这里有date而不是dateDE ,因为在更新版本的插件中, dateDE被删除了 。 它现在位于一个本地化文件中 ,只是覆盖了date方法。 如果您使用的是较旧的版本,那么只需坚持使用dateDE

你可以在这里试一下


评论更新:更通用的表单如下所示:

 $.validator.addMethod("oneOf", function(value, element, params) { for(p in params) { if(params.hasOwnProperty(p) && $.validator.methods[p].apply(this, [value, element, params[p]])) return true; } return false; }, "Please enter a valid date"); 

规则看起来像这样:

 $("form").validate({ rules: { dateFieldName: { oneOf: { dateISO:true, date:true } } } }); 

你可以在这里尝试一个演示 ,这需要任意数量的validation器函数并运行它们,至少有一个必须返回true才能成功。

 dateISO: function(value, element) { return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); }, dateDE: function(value, element) { return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); } 

资源

让它结合起来…… 🙂

 jQuery.validator.addMethod("dateISOorDE", function(value, element) { return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); }, "Please specify the correct date");