4

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

发生的情况是验证发生在自动完成设置其值之前。因为验证发生在 onBlur 上,并且您刚刚单击了自动完成列表中的一个项目,所以在输入填充其新值之前的一瞬间,模糊触发和验证发生。

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

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

有任何想法吗?

4

1 回答 1

4

我能够完成这项工作,但可能不像我希望的那样优雅。理想情况下,我希望在超时闭包中调用 onfocusout 的原型或默认版本,但我无法弄清楚如何从该范围内引用它。

我采用的方法是使用其代码复制/粘贴到超时闭包来覆盖 onfocusout 方法。唯一的其他调整是将引用从 this 更改为 _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);
            }
    });

随时发布改进。

于 2010-05-14T20:33:43.263 回答