Почему мой спиннер GIF останавливается во время выполнения вызова jQuery ajax?

Я только начинаю отвыкать от ASP.NET UpdatePanels. Я использую jQuery и jTemplates для привязки результатов веб-службы к сетке, и все работает нормально.

Вот в чем дело: я пытаюсь показать GIF-файл счетчика, пока таблица обновляется (а-ля UpdateProgress в ASP.NET). У меня все работает, за исключением того, что счетчик заморожен. Чтобы увидеть, что происходит, я попытался переместить счетчик из блока прогресса обновления на страницу, где я могу видеть его все время. Он вращается и вращается до тех пор, пока не начнется обновление, и остается замороженным до завершения обновления, а затем снова начинает вращаться. Не совсем то, что вы хотите от счетчика "пожалуйста, подождите"!

Это в IE7 - еще не было возможности протестировать в других браузерах. Какие-нибудь мысли? Является ли вызов ajax или привязка данных на стороне клиента настолько ресурсоемкими, что браузер не может обрабатывать свои анимированные GIF-файлы?

Обновлять

Вот код, обновляющий сетку. Не уверен, синхронный это или асинхронный.

updateConcessions = function(e) {
    $.ajax({
        type: "POST",
        url: "Concessions.aspx/GetConcessions",
        data: "{'Countries':'ga'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            applyTemplate(msg);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
        }
    });
}

applyTemplate = function(msg) {
    $('div#TemplateTarget').setTemplate($('div#TemplateSource').html());
    $('div#TemplateTarget').processTemplate(msg);
}

Обновление 2

Я только что проверил документация jQuery, и метод $.ajax() по умолчанию асинхронный. Просто ради удовольствия добавил это

$.ajax({
    async: true,
    ...

и это не имело никакого значения.

Когда происходит вызов, показывающий счетчик?

Jonathan S. 10.10.2008 18:33

Вы отключили анимацию в настройках IE?

leppie 10.10.2008 18:37

Это может помочь тем, кто искал, как я: stackoverflow.com/questions/7440897/…

Circle B 18.04.2015 18:57

Лучшее решение fgnass.github.io/spin.js

Professor of programming 11.09.2015 16:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
49
4
73 692
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Вы делаете синхронный вызов или асинхронный вызов? синхронные вызовы действительно вызывают блокировку браузера на время вызова. Другая возможность состоит в том, что система очень занята своей работой.

Я видел такое поведение в прошлом при вызовах AJAX. Я считаю, что это связано с тем фактом, что браузеры являются только однопоточными, поэтому, когда возвращается вызов AJAX, поток работает с вызовом, поэтому анимированный GIF должен на мгновение останавливаться.

Я сомневаюсь, что это неизбежное следствие архитектуры браузера - при использовании элементов управления UpdatePanel / UpdateProgress в ASP.NET (что приводит к негласному вызову ajax) анимированные GIF-файлы работают нормально.

Herb Caudill 10.10.2008 18:30

Думаю, вы обнаружите, что GIF-анимация происходит в другом потоке, чем тот, в котором работает Javascript. Я предполагаю, что пауза возникает в той точке внутри кода, где innerHTML назначается новый контент.

AnthonyWJones 10.10.2008 19:08

Я не помню точно, что вызвало это, но у нас была аналогичная проблема с IE6 в загруженном ящике, и мы исправили ее с помощью этого невероятного взлома в Javascript:

setTimeout("document.images['BusyImage'].src=document.images['BusyImage'].src",10);

Это просто устанавливает источник изображения на то, что было раньше, но этого, очевидно, достаточно, чтобы вывести IE из ступора.

edit: Я думаю, что помню, что было причиной этого: мы загружали анимацию в div с display: none. IE загружает его и не запускает анимацию, потому что она скрыта. К сожалению, он не запускает анимацию, когда вы устанавливаете содержащий блок для display: block, поэтому мы использовали приведенную выше строку кода, чтобы обманом заставить IE перезагрузить изображение.

Я тоже припоминаю кое-что в этом роде.

leppie 10.10.2008 19:39

Когда вы устанавливаете этот тайм-аут?

Jonathan S. 10.10.2008 19:42

(Я добавил некоторые детали к своему исходному ответу, но я уточню здесь). Строка settimeout () вызывается после того, как мы устанавливаем блок продолжения изображения на display: block.

David 13.10.2008 21:18

Вы уверены, что GIF не вращается во время вызова AJAX?

В вашем concessions.aspx поместите эту строку где-нибудь в обработке GetConcessions: -

System.Threading.Thread.Sleep(5000);

Я подозреваю, что gif вращается в течение 5 секунд, а затем зависает, пока IE отображает и рисует результат.

Ответ принят как подходящий

Браузер замораживается не из-за вызова Ajax. Это обработчик успеха (applyTemplate). Вставка HTML в такой документ может заморозить IE, в зависимости от того, сколько HTML там. Это потому, что интерфейс IE является однопоточным; если вы заметили, фактические меню IE тоже замораживаются, пока это происходит.

В качестве теста попробуйте:

applyTemplate = function(msg) {
   return;
}

Вы правы, сэр. Думаю, мне нужно либо (а) смириться с этим, либо (б) найти более эффективный шаблонизатор.

Herb Caudill 10.10.2008 20:45

more efficient BROWSER больше нравится!

kralco626 11.04.2011 15:24

У меня тоже самое случилось IE. Это вызвано тем, что браузер отображает HTML-код обратно после вызова ajax. Не произошло ни в Chrome, ни в FF: /

webtrifusion 30.09.2011 19:37

Похоже, это происходит со мной в Chrome?!?

Webnet 17.07.2012 22:18

Это тоже происходит со мной, но мой GIF-файл перестает анимироваться во ВСЕХ БРАУЗЕРАХ, кроме Opera. Я тестировал IE9, FF, Chrome, Opera и Safari. В Opera файл GIF анимировался, но медленно. Я предполагаю, что Opera уступает время перерисовке экрана. Но со всеми другими браузерами файл GIF полностью заблокирован, когда я рендерил и помещал HTML в контейнер в ответ на вызов AJAX. Я знаю, что во всем есть тенденция обвинять IE, но в этом случае поведение IE идентично FF, Chrome и Safari.

Armchair Bronco 11.10.2012 01:31

Это работает, если вы поместите гифку как содержимое в iframe, даже в IE.

Hans 23.05.2013 06:50

@ArmchairBronco: Даже в моем случае загрузка gif зависает во всех браузерах, кроме Opera, при рендеринге шаблона. Как вы справились с этим замораживанием?

Raeesaa 05.08.2014 14:11

Вы можете запустить его снова, установив источник изображения на себя после вызова ajax. (image.src = Image.src) для IE.

Jason Gilley 11.02.2015 01:09

Вот лучший ответ, который я нашел: stackoverflow.com/questions/7440897/…

Circle B 18.04.2015 18:55

У меня была аналогичная проблема с зависанием браузера. Если вы разрабатываете и тестируете локально, по какой-то причине браузер зависает. После загрузки моего кода на веб-сервер он начал работать. Надеюсь, это поможет, потому что мне потребовались часы, чтобы разобраться в этом самостоятельно.

Я использую IE11, это именно то поведение, которое я наблюдаю.

dotnetN00b 31.07.2014 01:44

ну это по многим причинам. Во-первых, когда ajax обратный вызов сервера, вы почувствуете, что ваш gif завис на несколько миллисекунд, но не так много. После того, как вы начнете обрабатывать информацию, и в зависимости от объектов, которыми вы манипулируете, и того, как вы это делаете, у вас будет больше или меньше времени, когда ваш gif будет заморожен. Это потому, что поток занят обработкой информации. Например, если у вас есть 1000 объектов и вы выполняете заказ и перемещаете информацию, а также используете команды jquery и append, insert, $ .each, вы почувствуете, что гифка заморожена. Иногда невозможно избежать всех замороженных гифок, но вы можете ограничить время несколькими миллисекундами, делая это: Создайте список ответов ajax и обрабатывайте его каждые 2 секунды (с этим вы получите результаты в отдельном массиве, и вы будете вызовите его с одним setInterval, и вы избежите узкого места при попытке обработать один ответ, когда предыдущий ответ все еще обрабатывается). если вы используете JQuery, не используйте $ .each, используйте for. Не используйте манипуляции с dom (добавление, вставка и т. д.), Используйте html (). В резюме делайте меньше кода, рефакторинга и обработки всего ответа (если вы сделали больше 1), как только 1. Извините за мой английский.

Изображение зависает, потому что пока оно скрыто, IE отключил анимацию.

Чтобы исправить это, добавьте загружаемое изображение вместо того, чтобы отображать его:

function showLoader(callback){
    $('#wherever').append(
        '<img class = "waiting" src = "/path/to/gif.gif" />'
    );

    callback();
}

function finishForm(){
    var passed = formValidate(document.forms.clientSupportReq);

    if (passed)
    {
        $('input#subm')
            .val('Uploading...')
            .attr('disabled','disabled');
        $('input#res').hide();
    }

    return passed;
}
$(function(){
    // on submit
    $('form#formid').submit(function(){
        var l = showLoader( function(){
                         finishForm() 
                    });

        if (!l){
            $('.waiting').remove();
        }

        return l;
    });
});

Я знаю, что вопрос касался асинхронных вызовов ajax. Однако я хотел добавить, что в своих тестах, касающихся синхронных вызовов ajax, я обнаружил следующее:

Для синхронных вызовов ajax. Пока выполняется вызов (т.е. ожидает ответа сервера). Для теста я поставил задержку ответа сервера на сервере.

Firefox 17.0.1 - анимированный gif продолжает правильно анимироваться.

Chrome v23 - анимированный gif останавливает анимацию во время выполнения запроса.

Тест IE показывает результаты, аналогичные Chrome - мне удалось изменить вызов на асинхронный, но это может не помочь другим

eslsys 10.10.2013 19:04

Ответ Деннисмонсевича великолепен. Используйте spin.js, и сайт http://fgnass.github.com/spin.js/ показывает шаг, который довольно прост. При тяжелом процессе мы должны использовать анимацию CSS. Не следует использовать JS-анимацию и GIF-файлы из-за ограничения на один поток, иначе анимация зависнет. CSS-анимация отделена от потока пользовательского интерфейса.

Браузеры бывают однопоточными и многопоточными.

Для любого браузера: Когда вы вызываете функцию, содержащую вложенную функцию ajax

java / сервлет / jsp / Контроллер> сохранить Thread.sleep (5000); в сервлете, чтобы понять асинхронность в ajax, когда правда или ложь.

    function ajaxFn(){
    $('#status').html('WAIT... <img id = "theImg" src = "page-loader.gif" alt = "preload" width = "30" height = "30"/>');
    $('#status').css("color","red");
    $.ajax({
        url:"MyServlet",
        method: "POST",
        data: { name: $("textarea").val(),
                id : $("input[type=text]").val() },
        //async: false,
        success:function(response){
            //alert(response);  //response is "welcome to.."
            $("#status").text(response);
            $('#status').css("color","green");
        },
        complete:function(x,y){
            //alert(y)
        },
        error:function(){
            $("#status").text("?");
        }
    });
}
 

Обертывание вызова ajax в функции setTimeout помогло мне предотвратить зависание gif-анимации:

setTimeout(function() {
    $.get('/some_link', function (response) {
        // some actions
    });
}, 0);

Другие вопросы по теме