将 jQuery 验证插件中的验证方法与“或”相结合代替“和”

发布于 2024-09-07 14:25:50 字数 544 浏览 2 评论 0原文

在 jQuery 验证插件中,有几个方法可以执行相同的操作,但针对不同的区域设置,例如 dateISOdateDE,它们都验证日期格式。如何组合这些以便输入元素接受其中一个?

假设我的表单中有一个 ,并且我希望允许用户在此字段中仅输入日期。但是,我希望允许多种不同的日期格式 - 例如,用户应该能够输入 ISO 日期 根据德国日期规则格式化的日期。

如果我这样做,

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

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

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

In the jQuery Validation plugin there are a couple of methods that do the same thing, but for different locales, for example dateISO and dateDE, that both validate date formatting. How do I combine these so that the input element accepts either?

Let's say I have an <input type="text" name="dateInput" id="dateInput" /> in my form, and I want to allow users to enter only dates in this field. However, I want to allow for several different date formats - for example, the user should be able to enter either an ISO date or a date formatted accoding to German date rules.

If I do

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

the form will never be valid, as both date formats will be required and that requirement can never be fulfilled. Is there a way to combine these as an "or" instead of as an "and", without having to write my own validation method?

And if I do have to write my own, how do I make it as generic as possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七婞 2024-09-14 14:25:50

虽然您可以像 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< /code> 已删除。它现在位于 本地化文件 中,该文件仅覆盖 <代码>日期方法。如果您使用的是旧版本,那就没问题,只需坚持使用 dateDE 即可。

您可以在此处尝试演示


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

$.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 } }
  }
});

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

While you can combine the regexes like Reigel has, you can also just call those methods directly (in case they change!), like this:

$.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");

Now I have date instead of dateDE here, because in newer versions of the plugin dateDE was removed. It's now in a localization file that just overrides the date method. If you're using an older version that's fine, just stick with dateDE.

You can try a demo here


Update for comments: A more generic form would look like this:

$.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");

The rules would look like this:

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

You can try a demo here, this takes any number of validator functions and runs them, at least one must return true for it to succeed.

So要识趣 2024-09-14 14:25:50
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");
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);
}

source

lets combine it... :)

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");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文