2

フォームの送信時に、以下の省略された検証コードを実行しています。控えめな検証が私のフォームに設定されています。

(function () {
    "use strict";

    $("#feedbackForm").submit(function () {
        var t = $(this).serialize();
        var val = $(this).validate();
        console.log(val.errorList.length);
        return false;
    });
})();

Chrome でブレークポイントに到達すると、次のような動作が見られます。 目立たない検証動作

コンソールから、コードが最初に実行されたとき、検証のエラー リストで 0 個のエラーが認識されたことがわかりますが、ブレークポイントを介して実行を一時停止すると、検証のエラー リストで 4 個のエラーが認識されます。また、初回以降は、正しいエラー数が実行時に正しく計算されます。

  • これはどのように可能ですか?
  • 実行時に正しいエラー数を取得するにはどうすればよいですか?

編集1:

jsfiddle でこの問題を再現できないので、何か他のことが起こっているに違いありません。

フィドル


編集2:

また、送信ハンドラー内で使用すると、毎回2回目に正しい結果が得られることに注意する必要setTimeout()がありますが、これはmattytommoが彼の回答で述べたことを裏付けているように見えるだけです。

4

2 に答える 2

3

最終的には、エラーの数を手動で測定してもうまくいかない理由はわかりませんが、最終的には、フォームを検証し、その状態に基づいて何かを実行するだけで、それを達成するために、Darin Dimitrov のアドバイスが機能します。 :

目立たない検証がjquery関数で検証されたことを確認するには?

私は確かにそのvalid()方法を試したと思っていましたが、うまくいきませんでしたが、そうではなかったと思います. また、目立たないプラグインは、他の 2 つよりも時間的にこの方法を好むようです。

作業コード:

(function ($) {
    "use strict";
    
    $("#feedbackForm").on("submit", function () {
        var t = $(this).serialize(),
            val;

        val = $(this).validate();
        console.log(val.numberOfInvalids());
        console.log(val.errorList.length);
        console.log($(this).valid());       
        
        return false;
    });
})(jQuery);

検証

働くフィドル

フィドルは元のケースで機能していたので、更新する必要はありません。

于 2013-03-21T17:27:25.870 に答える
3

代わりに、同期チェックvalidateを使用できます。invalidHandlerそうすれば、それが完了したことがわかります。

フィドルでおそらく機能する理由は、フォームの検証が速いため、おそらく偶然ですが、実際の実装では遅くなります。

次のようなことを試してください:

$("#feedbackForm").submit(function () {
    var t = $(this).serialize();
    $(this).validate({
        invalidHandler: function(event, validator) {
            var errors = validator.numberOfInvalids();
            if (errors) {
                if (validator.errorList.length > 0) {
                    for (x=0;x<validator.errorList.length;x++) {
                        console.log("\n\u25CF " + validator.errorList[x].message);
                    }
                }
            }
        }
    });

   $(this).validate();

    return false;
});
于 2013-03-21T16:09:08.077 に答える