【发布时间】:2011-05-22 21:29:06
【问题描述】:
我有一个表格,它同时使用 jQuery Validate 和 Masked Input 作为电话号码和美国邮政编码字段。
例如,对于美国邮政编码,Masked Input 仅允许输入数字,并强制采用“99999”或“99999-9999”格式(其中 9 可以是任何数字)。验证规则要求相同。但在某些情况下,Validate 会在字段实际上应该有效时将其标记为无效。
代码细节
jQuery Validate 在邮政编码字段上使用的正则表达式是^\d{5}$|^\d{5}\-\d{4}$。
我使用 Masked Input 应用的掩码是 .mask('99999?-9999')
重现步骤
当我执行以下操作时,它们之间会产生冲突:
- 填写无效的邮政编码(例如,三位数字)
- 远离场地。 Masked Input 擦除输入(预期行为),jQuery Validate 将其标记为无效,因为它是空白的(也是预期的)。
- 返回 zip 字段并填写有效的 5 位 zip。
- 远离场地。 它仍然被标记为无效。这是意料之外的。
如果我填写 9 位数的 zip,则不会发生此问题。
假设
我认为这个错误是因为在 5 位 zip 的情况下,Masked Input 临时插入了“-____”以向用户显示他们可以选择输入一个破折号和另外四位数字。这会在模糊时被删除,但在被删除之前,该字段会被验证并失败,因为不允许使用下划线。
这一假设得到以下事实的支持:如果表单随后重新验证,则 zip 字段将通过。我有两种方法:
-
通过提交表单;单击提交按钮、zip 字段通过并提交表单时,所有字段都会重新验证。
-
通过设置重新验证该特定字段的
blur事件。例如:$("#zipcode").blur(function(){ $(this).closest('form').validate().element($(this)); });
这可以作为一个hacky解决方案,但不是很令人满意,因为1)默认设置已经在模糊上重新验证,所以这是重复的,2)它需要额外的代码除了正常的验证规则。
还有其他人遇到过这个问题吗? 您有比设置额外的模糊事件侦听器更优雅的解决方案吗?
更新:应用 hacky 解决方案
即使应用上面的 hacky 解决方案也没有我想要的那么好。例如,这不起作用:
$appDiv.delegate('input,select,textarea','blur',function(){
$(this).closest('form').validate().element($(this));
});
...这也不是:
$('input,select,textarea').live('blur',function(){
$(this).closest('form').validate().element($(this));
});
...但确实如此:
$('input,select,textarea').each(function(){
$(this).blur(function(){
$(this).closest('form').validate().element($(this));
});
});
由于这些元素是由 AJAX 加载的,因此每次加载表单部分时都必须运行 .each 版本。
【问题讨论】:
-
真棒问题 - 深思熟虑并提出。
标签: jquery validation maskedinput