0

ユーザー名が既に使用されているかどうかを確認する小さな jQuery/AJAX スクリプトがあります。PHP スクリプトにクエリを実行し、指定されたユーザー名を持つユーザーの数を出力します。フォームの検証エラーの数を追跡するエラー カウンターがあり、ユーザー名が既に使用されている場合はカウンターをインクリメントします。

//Keep track of number of errors
 var errors = 0;
 //Keep track of error messages
 var errorMsg = "";

//Check if the passwords match (this part works as expected)
 if($("#password").val() != $("#repeat").val()) {
     errors++;
     errorMsg += "<li>Passwords do not match!</li>";
 }

     //Now check if the user exists
     var userName = $("#user").val();
    $.ajax({   
        type: "POST",
        data : {'user': userName},
        cache: false,  
        url: "js/ajax/addUser.php?action=checkuser",   
        success: function(data){
            var result = parseInt(data);
            //For debugging purposes
            alert("Before checking the data, # of errors is: " + errors);
            if(result > 0) {
                errors++;
                errorMsg += "<li>A user with the name <strong>" + userName + "</strong> already exists!</li>";
            }
            //For debugging purposes
            alert("After checking the data, # of errors is: " + errors);

        }
    });
    //For debugging purposes
    alert("Before validating the form, # of errors is: " + errors);

     if(errors > 0) {
         //Output error message
     }
     else {
         //Send the form
     }

コメントで述べたように、alert()デバッグ用の がいくつかあります。最初の 2 つ (AJAX 要求内) は、正しい量のエラーを表示します。ただし、3 番目のエラーに到達すると、AJAX リクエスト内で発生したエラーは完全に無視されます。

コードを要点だけに切り詰めましたが、提供されたスニペット内でエラーが明確でない場合は、全体を投稿できます。

4

4 に答える 4

2

ajax は非同期です。ロジックを成功の中に配置します。

//Keep track of number of errors
 var errors = 0;
 //Keep track of error messages
 var errorMsg = "";

//Check if the passwords match (this part works as expected)
 if($("#password").val() != $("#repeat").val()) {
     errors++;
     errorMsg += "<li>Passwords do not match!</li>";
 }

     //Now check if the user exists
     var userName = $("#user").val();
    $.ajax({   
        type: "POST",
        data : {'user': userName},
        cache: false,  
        url: "js/ajax/addUser.php?action=checkuser",   
        success: function(data){
            var result = parseInt(data);
            //For debugging purposes
            alert("Before checking the data, # of errors is: " + errors);
            if(result > 0) {
                errors++;
                errorMsg += "<li>A user with the name <strong>" + userName + "</strong> already exists!</li>";
            }
            //For debugging purposes
            alert("After checking the data, # of errors is: " + errors);

            if(errors > 0) {
                //Output error message
            }
            else {
                //Send the form
            }
        }
    });
    //For debugging purposes
    alert("Before validating the form, # of errors is: " + errors);
于 2012-11-28T19:30:10.220 に答える
2

ajax リクエストのコールバック関数は非同期で実行されます。したがって、このリクエストの直後にあるコードは、呼び出しが戻る前に実行される可能性があります。

于 2012-11-28T19:30:52.737 に答える
1

これで私が理解している問題は、AJAX 呼び出しが行われている方法です。3回目の警告

alert("Before validating the form, # of errors is: " + errors);

作成した $.ajax 呼び出しと同時に呼び出されます。

あなたの意図は呼び出しを同期的に呼び出すことであるため、jquery Deffered Objectを使用して呼び出しを連鎖させることができます。

現在のコードで解決策を探している場合は、以下のコードを成功ハンドラー内に移動する必要があります。

alert("Before validating the form, # of errors is: " + errors);

     if(errors > 0) {
         //Output error message
     }
     else {
         //Send the form
     }
于 2012-11-28T19:38:27.880 に答える