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

Posted

技术标签:

【中文标题】jquery 验证正则表达式方法与 focusout 上的 jquery 掩码冲突【英文标题】:jquery validate regex method conflicts with jquery mask on focusout 【发布时间】:2018-08-11 02:13:34 【问题描述】:

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

邮政编码正则表达式:^\d5(-\d4)?$ 邮政编码掩码:99999?-9999 电话正则表达式:^(?(\d3))?[\s-]?\d3[\s-]?\d4$ 电话掩码:(999) 999-9999

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

$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 或电话掩码(即“____?-____”或“(_)_-____”)。因为这个掩码显然不符合正则表达式,所以它返回 false,我在输入周围看到那个红条。

当它触发表单验证并且输入为空时,“value”参数是一个空字符串,并且该方法返回true,因此表单保存成功。

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

当输入为空并且发生焦点输出正则表达式验证时,有什么方法可以阻止输入在“value”参数中传递掩码?

【问题讨论】:

您可以配置 $.validator 默认值 - 例如$.validator.setDefaults( onfocusout: false ); 但这些是全局应用的,而不是单个控件 谢谢@StephenMuecke!我可能是错的,但我认为可以将函数作为值而不是“false”传递,这将解决问题,如果我解决了,我会将其作为答案发布。 你的意思是覆盖验证器正则表达式函数吗?如果是这种情况,您也可以修改RegularExpressionAttribute 以具有OR 表达式,以便_____?-____ 也有效 @StephenMuecke 如果你喜欢添加答案,我会删除我的。 你的回答很好:) 【参考方案1】:

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

邮政编码正则表达式:^\d5(-\d4)?$|^\d5-____|_____-____ 电话正则表达式:^(?(\d3))?[\s-]?\d3[\s-]?\d4$|(___) ___-____李>

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

【讨论】:

以上是关于jquery 验证正则表达式方法与 focusout 上的 jquery 掩码冲突的主要内容,如果未能解决你的问题,请参考以下文章

[jquery]jquery正则表达式验证(手机号身份证号中文名称)

使用正则表达式的 jQuery Youtube URL 验证

非零和非十进制数的 JQuery 正则表达式验证

jQuery 电子邮件验证要求

ajax和jQuery同时操作唯一效验和正则表达式

为啥 jQuery 的电子邮件验证正则表达式如此简单?