как установить стиль через JavaScript в IE сразу - PullRequest
3 голосов
/ 08 июня 2010

недавно я столкнулся с проблемой IE. У меня есть функция

function() {
    ShowProgress();
    DoSomeWork();
    HideProgress();
}

где ShowProgress и HideProgress просто манипулируют стилем CSS 'display' с помощью метода jQuery css ().

В FF все в порядке, и в то же время я меняю свойство display на block, появляется индикатор выполнения. Но не в IE. В IE стиль применяется, как только я покидаю функцию. Это означает, что он никогда не показывается, потому что в конце функции я просто скрываю его. (Если я удаляю строку HideProgress, индикатор выполнения появляется сразу после завершения выполнения функции (точнее, сразу после завершения вызывающих функций - и поэтому в IE больше ничего не происходит)).

Кто-нибудь сталкивался с таким поведением? Есть ли способ заставить IE применить стиль немедленно?

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

Спасибо, Резна

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Синхронные запросы блокируют весь пользовательский интерфейс, что ужасно.Вы правы в своем предположении, но если вы хотите продолжить этот путь до внутренних кругов $ ада, попробуйте следующее:

function () {
    ShowProgress();
    window.setTimeout(function () {
        DoSomeWork();
        HideProgress();
    }, 0);
}

Обратите внимание, что я не проверял это.Попробуйте поиграть со значением времени ожидания (в настоящее время 0), если вы все еще ничего не видите.

0 голосов
/ 08 июня 2010

Попробуйте добавить метод HideProgress в setTimeout. Например:

function() {
    ShowProgress();
    DoSomeWork();
    setTimeout(HideProgress,0);
}

Даже если задержка составляет предположительно 0 миллисекунд, это приведет к чистому результату выброса метода HideProcess в конец очереди и может дать браузеру необходимую передышку.

[Edit] Я должен был упомянуть, что у этого метода есть недостаток, если вы вызываете этот метод очень часто и быстро: состояние гонки. Вы можете в конечном итоге выполнить предыдущий тайм-аут, в то время как другой DoSomeWork () выполняется. Это произойдет , если DoSomeWork потребуется очень много времени для завершения. Если это риск, вы можете реализовать счетчик для вашего индикатора выполнения и выполнять HideProgress только в том случае, если счетчик, который его запустил, совпадает с текущим значением счетчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...