Здравствуйте!
Помогите, пожалуйста, в решении следующей задачи. Бьюсь уже два дня, но ничего не выходит.
Имеется элемент div, который реагирует на событие onclick:
Код:
|
<div onclick='doStretch(1)'> &rt;&rt; </div> |
Функция doStretch() выполняется длительное время, и для утешения пользователя нужно нарисовать progress bar. В моем случае все просто: progress bar - просто анимированный gif, который должен появиться при клике на этот div, и исчезнуть в конце работы функции doStretch():
Код:
|
<script language='javascript'>
function doStretch(i) {
initProgress();
/* здесь идет очень долгий процесс, для которого нужно отобразить progress bar*/
releaseProgress();
}
function initProgress() {
var progressDiv = document.getElementById("stretchProgress");
progressDiv.style.visibility = "visible";
}
function releaseProgress() {
var progressDiv = document.getElementById("stretchProgress");
progressDiv.style.visibility = "hidden";
}
</script>
...
<body>
<img src='images/progress.gif' style="visibility: hidden;" id="stretchProgress"/>
... |
Однако этот прямой подход не работает. Браузер сначала полностью выполняет функцию doStretch() и только после этого отображает результат выполнения функций initProgress() и releaseProgress(), т.е. показывает и прячет картинку, символизирующую progress bar. Я понял это поведение следующим образом: браузер не скидывает свой буфер (где картинка уже стала visible) на отображение, но функции подобных flush() я в JS не нашел (я новичок в JavaScript).
Желаемый, но абсолютно неприемлемый результат получается, если написать функцию initProgress() с alert'ом:
Код:
|
function initProgress() {
var progressDiv = document.getElementById("stretchProgress");
progressDiv.style.visibility = "visible";
alert("все что угодно");
} |
Т.к. alert() является блокирующим вызовом, то браузер прерывает исполнение скрипта и выводит текущий результат на экран, а затем уже продолжает выполнять сценарий после исчезновения alert'а. Но alert, как вы понимаете, здесь недопустим, а других блокирующих вызовов типа sleep(), насколько я знаю, в JavaScript нет.
Может кто-нибудь знает, как можно выйти из этой ситуации? Помогите, пожалуйста.