Я только что нашел работоспособное решение этой проблемы. Я занимаюсь разработкой Microsoft MVC 2 в Chrome, затем проверяю, правильно ли работают мои веб-страницы в IE 7. Я использую jQuery 1.4.3 и blockUI v2.31. По умолчанию blockUI в Chrome очень плавный, а в IE короткий и прерывистый.
Итак, вот суть того, что я делаю.
У меня есть функция, которая делает вызов jQuery $ .ajax, незадолго до вызова я блокирую UI, затем, когда вызов завершается, я разблокирую UI. Иногда эта операция занимает несколько секунд, и диалоговое окно блочного интерфейса отлично смотрится как в Chrome, так и в IE, поскольку анимированный GIF показывает прогресс. Но в других случаях операция выполняется очень быстро, и диалоговое окно блокировки пользовательского интерфейса в IE7 выглядит прерывистым и резким (в Chrome по-прежнему прекрасно выглядит).
Решением было добавить немного более длительную задержку в функцию, которая скрывает диалоговое окно интерфейса пользователя, скажем, 1,2 секунды вместо 200 миллисекунд. Так как большинство моих операций в любом случае занимают несколько секунд, это едва заметно и делает интерфейс пользователя удобным в обоих браузерах.
Например, эта функция вызывается в моем клиентском коде и обновляет элемент страницы:
function ajaxLoadElement(url, elementName, loadData, complete) {
// block the UI
ajaxWaitCursor();
$.ajax({
url: url,
data: loadData,
success: function(data, textStatus, jqXHR) {
// asynchronous call was successful: unblock the UI
ajaxNormalCursor();
$('#' + elementName).html(data);
if (complete != null) {
complete();
}
},
error: function(jqXHR, textStatus) {
// asynchronous call encountered an error: unblock the UI and display the error
ajaxNormalCursor();
displayAjaxLoadError(jqXHR);
}
});
}
Вот мои вспомогательные функции для блокировки и разблокировки интерфейса:
///
/// Shows a jQuery busy popup with a 20 second timeout
///
function ajaxWaitCursor() {
var imgPath = getImageResource("Content/Images/ajax-loading.gif");
var img = '<img src="' + imgPath + '" style="margin-top: 5px;" />';
$.blockUI(
{
message: img,
fadeIn: 400,
fadeOut: 400,
timeout: 20000,
showOverlay: true,
textAlign: 'center',
centerY: true,
centerX: true,
css: {
border: '',
padding: '5px',
backgroundColor: '#000',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
'border-radius': '10px',
opacity: 0.5,
color: '#fff'
},
overlayCSS: { opacity: 0.1 }
});
}
///
/// Hides the jQuery busy popup; to make this smooth on IE, give it
/// a reasonable amount of time to remain visible, in case the operation
/// was really short.
///
/// In this case, wait for 1.2 seconds before fading out the dialog
///
function ajaxNormalCursor() {
setTimeout("$.unblockUI()", 1200);
}