progress bar для JS
Здравствуйте!
Помогите, пожалуйста, в решении следующей задачи. Бьюсь уже два дня, но ничего не выходит. Имеется элемент div, который реагирует на событие onclick: Код:
<div onclick='doStretch(1)'> &rt;&rt; </div>Код:
<script language='javascript'>Желаемый, но абсолютно неприемлемый результат получается, если написать функцию initProgress() с alert'ом: Код:
function initProgress() {Может кто-нибудь знает, как можно выйти из этой ситуации? Помогите, пожалуйста. |
я бы предложил тебе привести сюда код функции doStretch, и мы бы помогли тебе её оптимизировать, чтобы она выполнялась быстро.
|
Браузер все равно будет зависать, и никакого анимированного гифа все равно не будет видно.
|
Проблема в том, что у меня используется тулзовина (CodeThatGrid), которая позволяет генерить интерактивные гриды, как в Excel'е. Функция doStretch() должна пройтись по строке с индексом i и выставить в каждую ячейку некоторое значение (распространить одно и то же введенное пользователем значение). Ситуация становится критической, когда грид содержит большое число столбцов (это необходимо заказчику).
Вот сама функция:
function doStretch(i) {
initProgress();
if ( !(cg instanceof CCodeThatGrid) ) return;
if ( Undef(window.lastStretchPositions) )
window.lastStretchPositions = new Array(NUM_ROWS - 1);
var lastVisibleCellIndex = getLastVisibleCellIndex();
var stretchVal, stretchInitialPos;
for ( var j = 3; j <= lastVisibleCellIndex; j++ ) {
if ( Undef(cg.cells[i][j]) ) continue;
var currentVal = parseFloat( cg.cells[i][j].getData() );
if ( isNaN(currentVal) ) continue;
stretchVal = currentVal;
stretchInitialPos = j;
}
if ( Undef(stretchInitialPos) ) return;
if (stretchInitialPos + 1 > lastVisibleCellIndex) return;
if ( Def(window.lastStretchPositions[i]) ) {
delete lastStretchPositions[i];
}
window.lastStretchPositions[i] = new Array();
var index = 0;
for ( var j = stretchInitialPos + 1; j <= lastVisibleCellIndex; j++ ) {
if ( Undef(cg.cells[i][j]) ) break;
if ( cg.cells[i][j].col.isReadOnly || cg.cells[i][j].isReadOnly ) continue;
cg.cells[i][j].setData(stretchVal);
window.lastStretchPositions[i][index] = j;
index++;
}
releaseProgress();
}
И вот та ее часть, которая отрабатывает мучительно долго:
...
for ( var j = stretchInitialPos + 1; j <= lastVisibleCellIndex; j++ ) {
if ( Undef(cg.cells[i][j]) ) break;
if ( cg.cells[i][j].col.isReadOnly || cg.cells[i][j].isReadOnly ) continue;
cg.cells[i][j].setData(stretchVal);
window.lastStretchPositions[i][index] = j;
index++;
}
releaseProgress();
}
|
?
function doStretch(i) {
initProgress();
setTimeOut(function(){
/* здесь идет очень долгий процесс, для которого нужно отобразить progress bar*/
releaseProgress();
},500);
}
function initProgress() {
var progressDiv = document.getElementById("stretchProgress");
progressDiv.style.visibility = "visible";
}
function releaseProgress() {
var progressDiv = document.getElementById("stretchProgress");
progressDiv.style.visibility = "hidden";
}
|
Неужели нет никакого способа отрисовать progress bar?
|
Gvozd,
Большое спасибо! Действительно, это помогло. :) |
Судя по коду функции торомоза складываются в цикле из-за медленой функции (либо Undef, либо setData). Надо попрофилировать выполнение да посмотреть, что тормозит...
|
|
Firebug и профилировщик, встроенный в него вам в помощь!
|
ZoNT, Gvozd,
Спасибо! Появился повод поставить Firebug :) |
Проблема решена, но осталась непрятная мелкость: браузер, выполняя скрипт, перестает анимировать гиф (который progress bar). Хочется узнать у профессионалов: есть ли способ обойти это гадкое поведение? Висящий в одном кадре гиф (по наблюдениям за пользователями) их совсем не успокаивает, а, наоборот, провоцирует на беспорядочные кликанья мышкой -(
|
Dagger, сказано же было
Цитата:
|
Dagger, я настоятельно тебе советую отпрофилировать скрипт, найти тормозные функции и переписать их, чтобы они работали быстрее.
Ну или дай нам ссылку на тестовую страничку с данным скриптом, мне вот уже инетресно, что такого можно делать в скрипте, чтобы браузер подвисал... |
Цитата:
генерация ColorMenu. |
Ну ведь сортировать можно так, что ничего висеть не будет! вот я и хочу посмотреть. чего ж там такого накодили, что всё висит...
|
ZoNT, Riim,
Большое спасибо за участие. Вы были правы - гораздо разумнее оптимизировать JavaScript-код, нежели городить виснущие прогресс-гифы. Ссылку на сайт дать не могу, так как это не сайт, а внутреннее приложение нашей конторы для HR-отдела. Дело было вот в чем. Имеется сторонний продукт http://www.codethat.com/grid/, который мы используем в качестве Excel-подобной таблицы. При внесении данных в какую-либо ячейку необходимо пересчитать некоторые групповые значения (total'ы, cost'ы) и т.д. Чтобы этого добиться человек, поддерживавший это приложение до меня, в обработчик onclick ячейки вставил вызов своей функции типа calcTotal(). Эта функция, заканчивая пересчет для каждой ячейки итоговой суммы, просто перерисовывала весь грид, в котором (уже в моем случае) более 1000 ячеек. Проблема решилась отрисовкой только нужных ячеек, а не всего подряд. Ну и еще некоторые, не столь принципиальные моменты, тоже выкинул. Очень в этом деле помогла консоль Firebug'а, а также его инспектор, благодаря которому удалость легко отыскать в простыне HTML'я нужные идентификаторы ячеек. Кстати, очень интересную статью по поводу прогресс-баров нашел здесь: http://webo.in/articles/habrahabr/13...ve-javascript/ |
Цитата:
|
Riim,
Я ее обнаружил чисто случайно, когда уже уверил себя в том, что информативные прогресс-бары средствами JS невозможны. |
| Часовой пояс GMT +3, время: 03:35. |