jquery 验证正则表达式方法与 focusout 上的 jquery 掩码冲突

jquery validate regex method conflicts with jquery mask on focusout

我有一个 asp.net mvc 模型,它在邮政编码和 phone 字段上使用 RegularExpressionAttribute,在输入上使用 jquery.maskedinput(来自 Josh Bush 的 v1.4.1)。没有必需属性。

我正在通过如下所示的调用将掩码应用于输入:

$form.find('.zip-mask').mask('99999?-9999');

表单验证工作正常。但是,如果我离开这些屏蔽的正则表达式输入之一并将该字段留空 jquery 验证会为输入提供亮红色轮廓,表示无效。我想防止这种情况发生。

我可以看出问题出在哪里。我正在使用 jquery.validate 版本 1.16.0。在jquery.validate.unobtrusive.js第342行这行代码添加了正则表达式验证方法:

$jQval.addMethod("regex", function (value, element, params) {

此方法会在 focusout 事件和表单验证时触发。当它在 focusout 上触发并且输入为空时,"value" 参数包含 zip 或 phone 掩码(即“_____?-____”或“(_) _-____").由于此掩码显然不符合正则表达式,因此它 returns false 我在输入周围看到了红色条。

当它触发表单验证且输入为空时,"value" 参数为空字符串,并且方法 returns 为真,因此表单成功保存。

总结一下:表单验证有效,因为当表单验证时 "value" 参数是一个空字符串,但是 focusout 验证失败,因为在 focusout 上 "value" 参数是掩码。

当输入为空且发生 focusout 正则表达式验证时,是否有任何方法可以阻止输入在 "value" 参数中传递掩码?

根据 Stephen Muecke 的建议,答案是简单地将 OR 条件附加到每个正则表达式的末尾,因此两个正则表达式现在看起来像这样:

  • 邮政编码正则表达式:^\d{5}(-\d{4})?$|^\d{5}-____|_____-____
  • Phone 正则表达式:^(?(\d{3}))?[\s-]?\d{3}[\s-]?\d{4}$|(___) ___-____

邮政编码正则表达式需要两个 OR 条件,因为邮政编码可以是 5 位或 9 位数字。第一个 OR 处理 5 位数的 zip 和部分掩码,另一个处理空输入,即整个掩码。