使用jQuery自动完成和Validator onBlur计时问题

时间:2010-05-13 21:25:55

标签: jquery-validate timing jquery-autocomplete onblur

这是我的问题,我在一个实现jQuery.Autocomplete和jQuery.validate的表单中有一个输入元素,所有工作都正常,除非我单击自动完成列表中的一个元素来选择它。

在自动填充设置其值之前,会发生什么验证。因为验证发生在onBlur上,并且您只是单击自动完成列表中的某个项目,所以模糊火灾并在输入填充其新值之前一瞬间发生验证。

我不介意双重验证,如果它是客户端,但我碰巧在这个领域执行昂贵的远程ajax验证,所以我真的想以正确的方式解决这个问题。

我的第一个想法是通过一个超过10ms后超时的函数代理所有验证onBlur事件,基本上是翻转事件顺序。但是,我,这意味着撕毁jQuery.Validate.js代码,我宁愿不这样做。

有什么想法吗?

1 个答案:

答案 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);
            }
    });

随意发布改进。