Загрузка gif-изображения не отображается в IE и хроме
Я использую JQuery ajax-вызов для отправки синхронизированного вызова на сервер и хочу отображать загружаемое изображение за это время.
Но загрузка изображения видна в Firefox, но не в IE и хром. Когда я отлаживаю, я обнаружил, что в IE, когда мы вызываем java script, он перестает показывать изменения в браузере, поскольку он останавливает DOM, и когда вызов завершен, он показывает все изменения. Так как я показывает загрузочное изображение на вызов ajax и удаляю его после завершения вызова, IE не отображает изображения.
Но когда я использую окно предупреждения, он показывает загрузочное изображение в IE, поскольку он останавливает поток до тех пор, пока мы не ответим на него.
Есть ли способ остановить выполнение java script за миллисекунду, чтобы приостановить выполнение IE и загрузить изображение.
Я уже пробовал ajaxSend, ajaxComplete, ajaxStart, ajaxStop события JQuery и таймера java script, но не получил никакого решения.
Любая помощь драгоценна, спасибо заранее.
Ответы
Ответ 1
В контексте XHR синхронно означает, что браузер зависает, пока запрос не будет завершен. Если вы хотите, чтобы убедиться, что только один запрос запущен в заданное время, используйте свой собственный флаг, чтобы указать, что запрос выполняется.
По определению, синхронный флаг запроса означает, что любое другое действие должно прекратиться. Я удивлен, что он даже работает в Firefox, в прошлый раз я пытался, чтобы он не работал, но это было давно. Поэтому забудьте об этом, нет способа заставить его работать во всех браузерах. Даже если вы задерживаете запрос с помощью setTimeout
, в лучшем случае вы получите замороженный браузер с неанимированным gif. И пользователям не нравится, когда вы замораживаете свой браузер, особенно если запрос может занимать больше секунды.
Никогда не зависеть от браузера для обеспечения безопасности или прав функций, связанных с функциональностью. Если ваше приложение может быть повреждено, если клиент выполняет два запроса параллельно, тогда у вас есть ошибка на стороне сервера, Ничто не мешает злоумышленнику выполнять параллельные запросы с использованием других инструментов, чем обычный пользовательский интерфейс.
Ответ 2
Вероятно, проблема заключается в "синхронизированной" части в открытии сообщения.
Откройте соединение асинхронно. Это блокирует блокировку браузера, и он будет работать так, как вы ожидаете. (установите async = true на объект XmlHttpRequest/activex)
Ответ 3
попробуйте показать загружаемое изображение в начале вашего jquery-вызова ajax и скрыть его при успешном событии
или
вы также можете использовать устаревшее время
Ответ 4
Я также столкнулся с подобной проблемой при работе с ajax, например, когда я применил некоторые стили к пользовательскому интерфейсу во время вызова ajax, но они не применяются к пользовательскому интерфейсу и то же, что и вы сказали, что если мы добавим предупреждение, оно будет работать так, как ожидается, до тех пор, пока не будет нажата кнопка ОК для предупреждения
Я не могу догадаться, почему это происходит, но вы можете использовать JQuery для показа или Hide that Loading.... div
Надеюсь, он сработает.
Ответ 5
У меня была аналогичная проблема, и я разобрал ее, используя панель обновления в ASP.NET. Если вы используете PHP или любую другую технологию, вам нужно использовать ajax-вызов. Если вы выполняете синхронизированный вызов, загрузка изображения не будет отображаться.
Ответ 6
У меня была схожая ситуация, с которой нужно иметь дело, если вам нужно сделать синхронный вызов, браузер приостановит манипуляции с DOM. Поэтому, если это абсолютно необходимо, соблюдайте асинхронные вызовы.
Существует обходной путь для управления DOM и отображения элемента перед запуском вызова ajax. Используйте jQuery animate() и сделайте вызов ajax в обратном вызове для завершения анимации. Следующий код работает для меня:
//show the loading animation div
$('#loading').show();
//call dummy animate on element, call ajax on finish handler
$('#loading').animate({
opacity: 1
}, 500, function() {
//call ajax here
var dataString = getDataString() + p + '&al=1';
$.ajax(
{
type: 'GET',
async: false,
url: 'uldateList.php',
data: dataString,
dataType: 'json',
success: function(result){
//Do something with result
...
//hide loading animation
$('#loading').hide();
}
});
});
Ответ 7
Вы можете попробовать выполнить синхронный вызов ajax в обратном вызове загрузки изображения.
Что-то вроде:
var img = new Image();
img.src = "loading.gif";
img.onload = function() {
/* ajax synch call */
}
Затем добавьте img в DOM.
Ответ 8
Привет, попробуйте изменить ajax-вызов, как это работает для меня
xmlHttp.open('POST', url, true);
xmlHttp.onreadystatechange = myHandlerFunction;
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("Accept-Charset", "charset=UTF-8");
xmlHttp.send(query);
Ответ 9
Я использовал информацию Серджиу Думитриу как базу. Я установил асинхронное значение true и добавил
beforeSend: function() {
$('#Waiting').jqmShow();
},
complete: function() {
$('#Waiting').jqmHide();
}
И это сработало для меня. В основном я создал собственный атрибут async: false.
Ответ 10
В вашем вызове $.ajax вам нужно добавить async: true. Следующий код работает для меня:
$.ajax({
url: 'ajax_url',
data: 'sending_data',
type: 'POST',
cache : false,
async: true,
beforeSend: function() {
$('#id_of_element_where_loading_needed').html('html_of_loading_gif');
},
success: function(data) {
$('#id_of_element_where_result_will_be_shown').html(data.body);
}
});