我正在验证一个包含用户个人资料信息的表单,并且我想检查我的服务器以查看用户指定的用户名是否已在使用中。我已经定义了一个这样的验证方法:
$.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 调用所阻碍,这对我来说根本没有意义。有人可以提供一些见解吗?谢谢!