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 に答える