3

カスタム フィールドをチェックするための JQuery 検証メソッドを作成しました。データを確認するために、AJAX を使用してサーバー側スクリプトを呼び出します。これにより、true または false が返されます。false の場合、応答にはエラー メッセージも含まれます。

var errorMessage;
var rtErrorMessage = function() {
    return errorMessage;
}

jQuery.validator.addMethod('customvalidation', function(value, element) {
    var valid = true;
    var url = '/validation?data=' + value;
    $.ajax({
        url: url,
        type: 'get',
        dataType: 'json',
        async: false,
        success: function(responseData) {
            if (responseData && !responseData.isValid) {
                errorMessage = responseData.errorMessage;
                valid = false;
            }
        }
    });

    return valid;
}, rtErrorMessage);

これは機能しますが、同期を切り替えると、リクエスト中にブラウザがフリーズします。これはかなり面倒で、JQuery はそれを推奨することさえあります...しかし、代替手段は何ですか?

前もって感謝します。

4

5 に答える 5

4

jquery validate のリモート メソッドを使用します。true または false を返すと、デフォルトのエラー メッセージが表示され、フィールドは有効/無効としてマークされます。

「これは私のエラー メッセージです」などの他の文字列を返す場合、表示されるエラー メッセージは、返された文字列になります。

ドキュメントがそうでなければそれらが古くなっていると言う場合、私はjquery validate 1.10.0を使用しています

于 2013-02-19T16:09:42.827 に答える
1

これを行う標準的な方法は、コールバック関数に制御を放棄し、データベースが決定を下した後に問題が発生したことをユーザーに知らせることです。明らかに、ajax 呼び出しの結果を返す関数が本当に必要な場合は、async=false が必要ですが、それを行う方法は他にもあります。すべてのフォーム要素が検証されるまでフォームの送信を防ぐために、各 ajax 呼び出しが true を返すのを待つ必要はありません。フォーム要素が検証されていることを確認するために、いくつかのフラグ (コールバックが設定できる) をチェックするだけで済みます。検証済み。一部の検証リクエストがまだ完了していない場合、これには少し時間がかかる場合がありますが、通常、ユーザーは ajax よりも低速です。

TLDR: ajax async を使用し、必要になるまでコールバックを待たないでください。いくつかのプロセスを実行できない場合は、async=false で立ち往生しています。

于 2013-02-19T14:01:27.230 に答える
1

フィールドが以前に検証されていない限り(つまり、最後の検証以降に変更がなく、検証が成功した場合を除き)、バリデーターは常にfalseを返す必要があると思います。これには、明らかに追加のハンドラーが必要です。実際、これを行う方法を少し考え直した方がよいかもしれません。Ajax を使用するほとんどのバリデーターは、おそらくすぐにコントロールを「無効化」し、何らかのデバウンスされたメソッドを呼び出します。onchangeメソッドは、コントロールを検証するかどうかを検証する Ajax を起動し、受信時にコントロールに有効かどうかのフラグを立てます。このようなものを使用すると、Ajax 呼び出しをバリデーター メソッドに配置することはありませんが、前述のフラグを使用することになります。デモンストレーション用のコードをいくつか書きたいのですが、現在、メインのコンピューターがダウンしています。

于 2013-02-19T14:36:06.230 に答える
0

この投稿の余談ですが、実際に async:false が検証に違反していることがわかりました。ユーザーからのフィードバックで「XXXX を送信しようとしたが、エラーが発生し、再度送信しようとするとエラーが発生しました」という問題が報告されていました。私をさせないだろう」。リモート検証リクエストで async: false を使用した場合にのみ発生しました。非同期にする必要があると思っていましたが、そうではないことがわかりました。それらを再び真実にすることで、すべてが厄介なものになりました。とても奇妙です。

于 2013-10-31T00:11:34.083 に答える
-1

検証を実行するためにサーバーにヒットする必要がある場合は、通常どおりフォームを送信し、(エラーが発生した場合) エラー メッセージが事前に入力されたフォームを返します。Ajax はまったく使用しないでください。データをサーバーに 2 回送信する必要があるだけです。

于 2013-02-19T13:33:20.730 に答える