У меня есть кнопка, которая запускает долго работающую функцию при нажатии. Теперь, когда функция запущена, я хочу изменить текст кнопки, но у меня возникают проблемы в некоторых браузерах, таких как Firefox, IE.
HTML:
<button id="mybutt" class="buttonEnabled" onclick="longrunningfunction();"><span id="myspan">do some work</span></button>
JavaScript:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
//long running task here
document.getElementById("myspan").innerHTML = "done";
}
Теперь с Firefox и IE возникают проблемы (в chrome все работает нормально)
Поэтому я подумал о том, чтобы поместить его в установленное время:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
setTimeout(function() {
//long running task here
document.getElementById("myspan").innerHTML = "done";
}, 0);
}
но это не работает и для Firefox! кнопка отключается, меняет цвет (из-за применения нового CSS), но текст не меняется.
Я должен установить время 50 мс, а не просто 0 мс, чтобы заставить его работать (измените текст кнопки). Теперь я нахожу это глупым по крайней мере. Я могу понять, будет ли это работать с задержкой 0 мс, но что произойдет в более медленном компьютере? может быть, Firefox потребуется 100 мс в установленное время? это звучит довольно глупо. Я пробовал много раз, 1 мс, 10 мс, 20 мс... нет, это не обновит. только с 50 мс.
Поэтому я последовал совету в этой теме:
Принудительное обновление DOM в Internet Explorer после манипуляций с javascript dom
поэтому я попытался:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
var a = document.getElementById("mybutt").offsetTop; //force refresh
//long running task here
document.getElementById("myspan").innerHTML = "done";
}
но это не работает (FIREFOX 21). Тогда я попробовал:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
var a = document.getElementById("mybutt").offsetTop; //force refresh
var b = document.getElementById("myspan").offsetTop; //force refresh
var c = document.getElementById("mybutt").clientHeight; //force refresh
var d = document.getElementById("myspan").clientHeight; //force refresh
setTimeout(function() {
//long running task here
document.getElementById("myspan").innerHTML = "done";
}, 0);
}
Я даже попробовал clientHeight вместо offsetTop, но ничего. DOM не обновляется.
Может ли кто-нибудь предложить надежное решение, желательно не взломанное?
заранее спасибо!
как предложено здесь, я также пытался
$('#parentOfElementToBeRedrawn').hide().show();
безрезультатно
Принудительно перерисовывать/обновлять DOM в Chrome/Mac
TL; DR:
ищем НАДЕЖНЫЙ кросс-браузерный метод для принудительного обновления DOM без использования setTimeout (предпочтительное решение из-за различных временных интервалов, необходимых в зависимости от типа долго выполняющегося кода, браузера, скорости компьютера и setTimeout, от 50 до 100 мс в зависимости от по ситуации)
jsfiddle: http://jsfiddle.net/WsmUh/5/