11
email1: {
                    required: true,
                    blacklist: true,
                    beanEmailValidator: true,
                    minlength: 6,
                    maxlength: 70,
                    remote: {
                        type: "GET",
                        url: llbFieldValJSONURL,
                        data: {
                              fieldData : function() {
                                return $("#enterEmail").val();
                              }                           
                         },
                        dataType:"json",
                        dataFilter: function(data) {
                            var json = jQuery.parseJSON(data);
                            if(json.error == "true") {
                                return "\"" + json.errorMessage + "\"";
                            } else {
                                return success;

                            }

                        }
                    }

                }

この関数は、ユーザー名の一意性をチェックし、一意でない場合はエラーを返します。問題は、リモートメソッドが有効になった後、追加の呼び出しを行わないことです。値が入力/変更されるたびにトリガーする必要があります。

たとえば、一意でないユーザー名を3つ入力すると、毎回呼び出しが行われます。一意のユーザー名を入力すると、呼び出しが正しく行われ、ユーザー名が有効なものとして返されます。したがって、フィールドは有効です。ここで、別の一意でない(無効な)ユーザー名を入力しても、リモートメソッドは再度トリガーされません。

どういうわけか応答をキャッシュしているのだろうか?

無効な(一意ではない)応答:

{"error":"true","errorMessage":"<b>The User Name you chose is already in use.</b>  Please enter another name."}

有効な(一意の)応答:

{"error":"false","errorMessage":""}

編集

SOでこれを見た:

https://stackoverflow.com/a/1821667/335514

$("#site").change(function() {
  $("#email").removeData("previousValue");
});

したがって、プラグインは応答をキャッシュしているようです。プラグインにはキャッシュをオフにするメソッドがありますか、それともcache: falseajax呼び出しにを追加しても同じことができますか?

編集

これらの方法はどちらも機能しませんでした。フィールドが有効とマークされると、リモート呼び出しを再度行うことはないようです。修正する方法についての考え?関数を独自のaddMethodに入れると、このシナリオを防ぐことができますか?

4

2 に答える 2

8

更新/解決策:

のソースコードjquery.validate.js、特にこのスニペットを見てください。

success: function(response) {
    validator.settings.messages[element.name].remote = previous.originalMessage;
    var valid = response === true;

    if ( valid ) {   ...

応答はJSONとして評価されるため、を呼び出す必要がありますreturn "true"これはドキュメントでも指摘されています

「応答はJSONとして評価され、有効な要素に対してtrueである必要があります」

ただし、以下が暗黙的に設定されているという事実を無視すると、trueの完全に等しいテストを実行するソースコードを見ると、かなり混乱する可能性があります。dataType: json

更新を終了


さらに調査すると、「dataFilter」が「success」を返すことはないはずです。

コールバック関数キュー@http://api.jquery.com/jQuery.ajax/を参照してください

dataFilterコールバックは、応答データを正常に受信するとすぐに呼び出されます。返されたデータとdataTypeの値を受け取り、成功に渡すために(変更された可能性のある)データを返す必要があります。

私の推測では、JSは実行しようとして中断するreturn successため、それ以上の検証要求は送信されません。

于 2012-07-15T23:29:43.243 に答える
7

同じ症状でしたが、別の問題が原因でした。

フィールドの値が変更されていないと判断した場合、jQueryリモート検証メソッドは別のajax呼び出しをトリガーしないようです。これは、携帯電話番号(IE 555-123-1234)と国コード(米国の場合はIE 1)の2つのフィールドで検証するリモート検証があるため、私にとっては問題でした。

携帯電話番号が変更されていないのに国番号が変更されている場合は、再検証する必要があります。ただし、検証が携帯電話番号フィールドにバインドされている場合、その値は変更されていないため、プラグインは別のajax呼び出しを行いません。

プラグインがリモートメソッドでこのキャッシュを実行する場所を確認できます。

if ( previous.old === optionDataString ) {
    return previous.valid;
}

プラグインは、jQueryの$dataメソッドと「previousValue」キーを使用して以前の値を保存します。したがって、私の場合、私がしなければならなかったのは、この値を明確にすることだけでした。

$("#my-phone-number-element").removeData("previousValue");
$("#my-phone-number-element").valid();
于 2016-04-25T17:17:33.923 に答える