ユーザー プロファイル情報を含むフォームを検証しています。ユーザーが指定したユーザー名が既に使用されているかどうかをサーバーで確認したいと考えています。次のような検証方法を定義しました。
$.validator.addMethod(
'check_username',
function(value, element, param) {
console.log('starting');
var name_is_in_use = 0;
// Start the throbber.
$('form#user-profile-form input#edit-name').addClass('searching');
// Hit the server and see if this name is already in use by someone else.
$.ajax({
url: '/checkusername/' + value + '/" . $form['#user']->uid . "',
dataType: 'json',
data: {},
async: false,
success:
function(data) {
console.log('back from the server');
name_is_in_use = data; // unnecessary, but whatever
// Kill the throbber
$('form#user-profile-form input#edit-name').removeClass('searching');
},
});
return name_is_in_use;
},
'Sorry, but this username is already in use.');
全体として、検証プロセスは機能します。私が問題を抱えているのは、入力フィールドに接続された「ビジー」スロバーを適切に機能させることです.スロバーは、通常の状態からビジー状態に決して変化しません。しかし、実際に起こっていることを誇張するためにサーバーに sleep() 呼び出しを追加した後、私が見ているのは、これらの両方の console.log ステートメントが同時にコンソールに表示されることです-サーバーへの呼び出しの後完了しました。これが、throbber の変更が見られない理由を説明してい.searching
ます。クラスは、追加された直後に削除されます。しかし、私が理解していないのは、なぜ私が思っていることが起こっていないのかということです:
- ブラウザーでフィールドをクリックして、検証メソッドを起動します。
console.log('starting')
コンソールに表示される- スロバーがオンになります。
- サーバーが呼び出され、少しスリープし、その値を返す間、一時停止があります。
console.log('back')
コンソールに表示される- スロバーがオフになります。
代わりに、私はこれを取得しています (throbber クラスの変更を無視します):
- ブラウザーでフィールドをクリックして、検証メソッドを起動します。
- サーバーが呼び出され、少しスリープし、その値を返す間、一時停止があります。
console.log('starting')
コンソールに表示され、遅延なく、console.log('back')
コンソールに表示される
ステップ 3 と 4 はほぼ同時に行われます。
私はこれについて本当に困惑しています。ハンドラーの実行全体が ajax 呼び出しによって停止しているように見えますが、これはまったく意味がありません。誰でもいくつかの洞察を提供できますか? ありがとう!