我有一个按钮,当它被点击时,它会运行一个长时间运行的函数。现在,当函数运行时,我想更改按钮文本,但我在某些浏览器(如 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 中它工作正常)
所以我想把它放到一个settimeout中:
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 在 settimeout 中需要 100ms?这听起来很愚蠢。试了很多次,1ms,10ms,20ms……不行,刷新不了。只有 50 毫秒。
所以我遵循了本主题中的建议:
javascript dom操作后在Internet explorer中强制刷新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 不会刷新。
有人可以提供可靠的解决方案,最好是 non-hacky 吗?
提前致谢!
正如这里所建议的,我也尝试过
$('#parentOfElementToBeRedrawn').hide().show();
无济于事
长话短说:
寻找一种可靠的跨浏览器方法来强制 DOM 刷新而不使用 setTimeout(首选解决方案,因为需要不同的时间间隔,具体取决于长时间运行代码的类型、浏览器、计算机速度和 setTimeout 需要 50 到 100 毫秒,具体取决于视情况而定)
jsfiddle:http: //jsfiddle.net/WsmUh/5/
原文由 MirrorMirror 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决了! 没有 setTimeout()!!!
在 Chrome 27.0.1453、Firefox 21.0、Internet 9.0.8112 中测试
在这里演示!