2

何の問題も見つからずに何時間も問題を抱えていました...

ユーザーがアカウントを作成するための登録フォームがあります。送信ボタンが押されると、validateForm 関数が呼び出されます。

この関数では、機能するいくつかの JavaScript テストを行いますが、ユーザー名が使用可能であることを確認する必要があります。このために、外部 PHP ファイルを作成し、$.ajax を使用して呼び出します。

コードの一部を次に示します。

function validateRegistration(){
// Some tests....

// Check if username is already used
// Call external php file to get information about the username
$.ajax({
    url: 'AjaxFunctions/getUsernameAjax.php',
    data: "username=" + $("#username").val(),
    success: function(data){
        // Username already in use
        if(data == "ko"){
            // Stop validateForm()
        }
        // Username not used yet
        else{
            // Continue tests
        }
    }
});
// Other tests
}

私の質問は、 $.ajax 内から validateForm() が false を返すようにするにはどうすればよいですか? たとえば、 Ajax 部分の前に js 変数を宣言し、それを Ajax で設定できますか?

答えは明らかだと思いますが、私は Ajax に全く慣れていないので、理解できません...

助けてくれてどうもありがとう!

4

5 に答える 5

1

これを達成するには、この回答で説明されているように同期 ajax 呼び出しを実行できますが、これは Web サイトのパフォーマンスにとって非常に危険です。

または、これが正しい方法です-ユーザー名が利用可能かどうかにかかわらず、外部変数が必要です。ユーザーが何かを入力するとすぐにリクエストを実行し、有効な場合は変数を変更します。そうでない場合は警告メッセージを表示します。次に、validateRegistration() 関数で、外部変数のみをチェックします (+ 呼び出し元に応じて、何らかの形式のコールバックが可能です)。利点は、リクエストが保留されている間、ユーザーが引き続き処理を実行できることです (フォームの残りの部分に入力するなど)。

于 2012-07-05T14:47:19.290 に答える
0

ここでの従来の解決策validateRegistrationは、ブール値を期待するコールバック関数を渡すことです。完了したら、Ajax関数にコールバック関数を呼び出させます。

ハンドラーはonsubmitすぐに戻り値を期待するため、送信イベントハンドラー内で非同期テストを実行することは、物事を行うためのかなり統一的な方法です。代わりに、できるだけ早く(たとえば、ユーザーがユーザー名を入力するとすぐに)テストを実行してから、ユーザー名の検証結果をグローバル変数に保存する必要があります。グローバル変数は、後で送信時にチェックされます。

// global variable indicating that all is clear for submission
shouldSubmit = false;

// run this when the user enters an name, e.g. onkeyup or onchange on the username field
function validateRegistration(callback) {
    shouldSubmit = false;
    // number of ajax calls should be minimized
    // so do all other checks first
    if(username.length < 3) {
        callback(false);
    } else if(username.indexOf("spam") != -1) {
        callback(false)
    } else {
        $.ajax({
            ....
            success: function() {
                if(data == "ko") {
                    callback(false);
                } else {
                    callback(true);
                }
            }
        });
    }
}

validateRegistration次に、関数の引数を使用して呼び出します。

validateRegistration(function(result) {
    alert("username valid? " + result);
    if(result) {
        $("#username").addClass("valid-checkmark");
    } else {
        $("#username").addClass("invalid-xmark");
    }
    shouldSubmit = result;
});

shouldSubmit次に、フォームのsubmitイベントハンドラーでグローバル変数を使用して、オプションでフォームの送信をブロックします。

于 2012-07-05T15:22:26.807 に答える
0

目的がユーザー名の可用性を確認することである場合、ユーザー名を入力するとき、または入力した直後に確認するのはどうでしょうか。たとえば、キーストロークのkeyUpイベントまたはテキスト ボックスを離れるときのblurイベントにバインドできます。

これは、ユーザーが送信ボタンに到達するまでに、フォームのその部分がすでに検証されていることを意味します。

于 2012-07-05T15:06:42.147 に答える
0

現在行っているように、非同期の代わりに同期ajax 呼び出しを行うことができます。これは、次のコード行が実行される前に Ajax 呼び出しが完了することを意味します。

jQuery でこれを行うにはasync: false、リクエスト オブジェクトに追加するだけです。

var someVariable;
$.ajax({
    url: 'AjaxFunctions/getUsernameAjax.php',
    data: "username=" + $("#username").val(),
    success: function(data){
        // Username already in use
        someVariable = "something";
        if(data == "ko"){
            // Stop validateForm()
        }
        // Username not used yet
        else{
            // Continue tests
        }
    },
    async: false
});
alert(someVariable); // should alert 'something', as long as the ajax request was successful
于 2012-07-05T14:47:35.593 に答える
0

PHP で、次のように JSON を出力すると:

echo json_encode(array("ko"=>"good"));

次のように表示されます。

{
 "ko":"good"
}

次に、関数では次のようになります

if(data.ko == "good"){
  //do stuff
}

これが私が通常行う方法です。JSON で使用した名前を使用して変数を取得できるため、必要に応じて他のものを使用できます。

于 2012-07-05T14:53:51.933 に答える