0

私はajax登録フォームを持っています。ユーザーは、入力フィールドに目的のユーザー名を入力し、すぐに登録ボタンを押すことができますが、ユーザー名が使用可能かどうかを確認する ajax 要求は完了していません。この場合、ユーザー名を確認する ajax リクエストが完了した場合にのみ登録ボタンのアクションの実行を開始し、それ以外の場合は完了するのを待ってから続行します。これを行う方法?

ユーザーが入力フィールドでキーアップを行うたびに実行されるため、ユーザー名検証関数は非同期のままにしておきます。

1 つの方法は、登録ボタンがクリックされたときに setTimeout() ループに入り、フラグが有効になるまでそこにとどまることです。もう 1 つの方法は、非同期要求が完了していない場合に同期ユーザー名チェック要求を呼び出すことです。より良い方法はありますか?

jQueryを使わずに答えていただけると助かります。

4

3 に答える 3

4

これには setTimeout を使用しないでください。

jquery の ajaxのコールバック機能を使用するだけです。successコールバックまたは新しいdoneヘルパーで「after」コードを実行します。

$.ajax({
  url: "test.html"
}).done(function() { 
  // do things after the answer has been received
});

編集 :

jquery を使用せず、すぐにトリガーしない場合:

var httpRequest = new XMLHttpRequest();
var requestDoneAndOK = false;
httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState === 4) {
        if (httpRequest.status === 200) {
                requestDoneAndOK = true;
        }               
    }
};
httpRequest.open('GET', url);
httpRequest.send();

そして、「登録」ボタンがクリックされrequestDoneAndOKたら、チェックして、それが真である場合は他の関数を呼び出すだけです。

編集2:

2 つの条件が実現するとすぐに、コードが実行されます: 回答が受信され、登録ボタンがクリックされます。

var registerClicked = false;
var ajaxAnswerReceived = false;
function check() {
    if (registerClicked && ajaxAnswerReceived) {
         // do the thing !
    }
}
var httpRequest = new XMLHttpRequest();
var requestDoneAndOK = false;
httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState === 4) {
        if (httpRequest.status === 200) {
              ajaxAnswerReceived = true;
                check();
        }               
    }
};
httpRequest.open('GET', url);
httpRequest.send();
document.getElementById('registerButton').onclick = function(){
     registerClicked = true;
     check();
};
于 2012-07-16T14:05:35.027 に答える
0

jQuery を使用せずにこれを行う場合は、onreadystatechange を使用してデフォルトの JavaScript 呼び出しメカニズムを使用する必要があります。jQuery はデフォルト メカニズムのラッパーに過ぎないことを思い出してください。jQuery などを使用して、多数のクロス ブラウザーの問題や http 状態変更ロジックを回避することをお勧めします。

ここでネイティブのものについてすべて読んでください:http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

于 2012-07-16T14:10:56.747 に答える
0

コールバックを使用し、ユーザーが登録ページを送信する前に確認する必要がある検証フラグのブール値を保存する必要があります。これは jquery の実装ですが、通常の js に変換するのは難しくありません。メソッドは次のように定義されています。

var goodUsername = false;

// keyup handler, pseudo code 
$('#username').keyup(function(event) { 
    // perform the username validation with an ajax call:
    $.ajax({
        url: "validateUsername.php"
    }).done(function(data) {
        // set the goodUsername if its good or not
        if (data.usernameIsGood)
            goodUserName = true;
    });
});

// submit the registration form only if the username has been checked and is good
$('#registrationFormButton').click(function(event){
     if (goodUsername)
         return true; // allows the browser to submit the form
     else
         return false;
});
于 2012-07-16T14:14:37.840 に答える