这是我的问题,我在一个实现jQuery.Autocomplete和jQuery.validate的表单中有一个输入元素,所有工作都正常,除非我单击自动完成列表中的一个元素来选择它。
在自动填充设置其值之前,会发生什么验证。因为验证发生在onBlur上,并且您只是单击自动完成列表中的某个项目,所以模糊火灾并在输入填充其新值之前一瞬间发生验证。
我不介意双重验证,如果它是客户端,但我碰巧在这个领域执行昂贵的远程ajax验证,所以我真的想以正确的方式解决这个问题。
我的第一个想法是通过一个超过10ms后超时的函数代理所有验证onBlur事件,基本上是翻转事件顺序。但是,我想,这意味着撕毁jQuery.Validate.js代码,我宁愿不这样做。
有什么想法吗?
答案 0 :(得分:4)
我能够使这个工作,但也许不像我希望的那样优雅。理想情况下,我希望在超时闭包内调用onfocusout的原型或默认版本,但我无法弄清楚如何从该范围引用它。
我采用的方法是覆盖onfocusout方法,将其代码复制/粘贴到超时闭包中。唯一的另一个调整是将引用从此更改为_this以在超时闭包的不同范围内工作。
$("#aspnetForm").validate({
success: "valid",
onkeyup: "false",
onfocusout:
function(element) {
//Delay validation so autocomplete can fill field.
var _this = this;
setTimeout(function() {
if (!_this.checkable(element) && (element.name in _this.submitted || !_this.optional(element)))
_this.element(element);
_this = null;
}, 250);
}
});
随意发布改进。