Я использую подключаемый модуль jQuery Alert Dialogs (http://abeautifulsite.net/, версия 1.1) и jQuery v1.6.1. . Протестировано в версиях IE 11 и Chrome 41.0.x. Есть тестовый код:
var t = (new Date()).getTime();
jAlert('Test message');
console.log('Alert displayed, d=' + ((new Date()).getTime() - t));
console.log(' Alert visible: ' + $('#popup_panel').is(":visible") + ', Overlay visible: ' + $('#popup_overlay').is(":visible") + ', d=' + ((new Date()).getTime() - t));
$.ajax({
url: 'http://ip.jsontest.com/',
data: { },
type: 'GET',
async: false,
complete: function() {
console.log('Ajax complete, d=' + ((new Date()).getTime() - t));
$.alerts._hide();
console.log(' Alert visible: ' + $('#popup_panel').is(":visible") + ', Overlay visible: ' + $('#popup_overlay').is(":visible") + ', d=' + ((new Date()).getTime() - t));
}
});
И вывод консоли:
Alert displayed, d=8
Alert visible: true, Overlay visible: true, d=9
Ajax complete, d=276
Alert visible: false, Overlay visible: false, d=281
Моя проблема в том, что когда я устанавливаю для $.ajax async значение false, окно предупреждения не отображается. Все работает нормально, когда для async установлено значение true. Я знаю, что означает async: false. Я использовал его в своей форме для отправки данных. Пока выполняется отправка данных, я хочу отображать и предупреждать окно с чем-то вроде «Выполняется операция ...» и блокировать любой пользовательский ввод (щелчок мышью, клавиша Enter на клавиатуре и т. д.). В некоторых местах моего приложения это работает, в других нет, и я не могу понять, почему. Есть ли способ убедиться, что изменения пользовательского интерфейса внесены до фактического вызова ajax?