2012-01-13 30 views
1

私はこの機能を作っていますが、それはうまくいくようですが、AJAXのための "#" instainedを返します。私は見て、リターンコールを削除しようとしました。Jquery validation async not working

戻る前にAJAXが終了するまで待つ必要があります。 JSPは正常に動作しています。

どうしたのですか?

jQuery.validator.addMethod("knidExist", function(value, element) { 
    var valid = "#"; 
     $.ajax({ 
      async: false, 
      type: "POST", 
      url: "USER.jsp", 
      data: "knid="+value, 
      dataType: "html", 
      success: function(msg) { 
       // if the user exists, it returns a string "true" 
       if($.trim(msg) != "true") { 
       //return false; 
       valid = false; // already exists 
       } else { 
       //return true; 
       valid = true;  // username is free to use 
       } 
      } 
    }); 
    return valid; 
}, 'This USER does not exist'); 
+0

AJAXの最初のAは**非同期**を表します。呼び出しが終了した後に関数を返すようにしようとするのは非常に悪い考えです。代わりにあなたのアプローチを再検討する必要があります。 – Jon

+0

誰かが私たちのために提供する解決策に、私は興奮しています! –

+0

@Jon - 彼らはasync:falseを設定しました。彼らは同期して電話をしようとしています。 – jfriend00

答えて

3

私は自分自身で方法を見つけました。リモートメソッドからほぼ完全なコピーですが、静的なメッセージとURLを使用します。 私は何かを助けることができますように願っています。

jQuery.validator.addMethod("userExist", function(value, element, param) { 
if (this.optional(element)) 
    return "dependency-mismatch"; 

var previous = this.previousValue(element); 
if (!this.settings.messages[element.name]) 
    this.settings.messages[element.name] = {}; 
previous.originalMessage = this.settings.messages[element.name].remote; 
this.settings.messages[element.name].remote = previous.message; 

param = typeof param == "string" && {url:param} || param; 

if (this.pending[element.name]) { 
    return "pending"; 
} 
if (previous.old === value) { 
    return previous.valid; 
} 

previous.old = value; 
var validator = this; 
this.startRequest(element); 
var data = {}; 
data["**user**"] = value; 
$.ajax($.extend(true, { 
    url: "validation.jsp", 
    mode: "abort", 
    dataType: "json", 
    data: data, 
    success: function(response) { 
     validator.settings.messages[element.name].remote = "**This user do not exist"**; 
     var valid = response === true; 
     if (valid) { 
      var submitted = validator.formSubmitted; 
      validator.prepareElement(element); 
      validator.formSubmitted = submitted; 
      validator.successList.push(element); 
      validator.showErrors(); 
     } else { 
      var errors = {}; 
      var message = response || validator.defaultMessage(element, "remote"); 
      errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message; 
      validator.showErrors(errors); 
     } 
     previous.valid = valid; 
     validator.stopRequest(element, valid); 
    } 
}, param)); 
return "pending"; 
}, ""); 
6

独自の検証方法を追加する代わりに、この目的のために正確に設計されたremote検証方法を組み込む必要があります。

あなたが

remote: { 
    type: "POST", 
    url: "USER.jsp", 
    data: { knid: value }, 
} 

チェックアウトのドキュメントがリンクの例のような方法でそれを使用することになります。

+0

私はこのメソッドを知っていますが、私はこの検証メソッドを100回使用するつもりです。したがって、jqueryの検証も同様にメソッドとして作成すると良いでしょう。 – boje

0

これらのリクエストタイプを「投稿」タイプにすると、問題が発生します。 これは基本的に値を送信し、応答を待たなかった。 "get"タイプにすると動作します。