我正在驗證包含用戶配置文件信息的表單,並且希望與我的服務器一起檢查用戶指定的用戶名是否已被使用。我已經定義了一個驗證方法,如下所示:爲什麼我的驗證ajax調用延遲整個驗證方法?
$.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語句同時出現在控制檯中 - 在調用服務器之後已經完成。這就解釋了爲什麼我沒有看到跳動的變化 - .searching
類在添加後立即被刪除。但我不明白的是,爲什麼我沒有看到我在想什麼應該要發生的事情:
- 我點擊瀏覽器領域火驗證方法。
console.log('starting')
顯示在控制檯中- 跳動者打開。
- 有一個暫停,而服務器被調用,睡了一下, 返回其值,
console.log('back')
顯示了在該活動指示器被關閉控制檯- 。
相反,我得到這個(忽略活動指示器類的變化):
- 我點擊瀏覽器領域火驗證方法。
- 有一個暫停,而服務器被調用,睡了一下, 返回其值,
console.log('starting')
顯示了在控制檯,然後,無延遲,console.log('back')
在控制檯中顯示出來
步驟3和4幾乎同時發生。
我對此非常疑惑 - 看起來整個執行程序被ajax調用阻止了,這對我來說根本毫無意義。任何人都可以提供一些見解嗎?謝謝!
'async:false'應該是'async:true' - 更多地閱讀這個設置。異步設置爲false會使請求異步。 http://api.jquery.com/jQuery.ajax/ – Pebbl 2013-02-26 23:31:30
請參閱:http://stackoverflow.com/a/13579061/594235 – Sparky 2013-02-27 00:13:03