JavaScript.代码未执行.用户界面未更新
JavaScript. code not executed. UI not updated
当在使
系统忙碌一段时间的代码块之前执行更新用户界面的代码行时,UI 不会更新。请参阅下面的代码:
<html>
<body>
<div id="acc">
<input type="text" value="start" id="id1"/>
<input type="text" value="e0" id="id2"/>
</div>
<script>
myFunction();
function myFunction() {
document.getElementById("id1").value="1";
var j=true;
for(var i=0;j==true;i++){
document.getElementById("id2").value="e"+i;
if(i==999999)
j=false;
}
document.getElementById("id1").value="2";
}
</script>
</body>
</html>
值 1 永远不会分配给输入文本 (id1)。这就像 JavaScript 代码没有同步执行一样。
有人可以帮忙吗?
你需要使你的代码异步,就像这样;
<html>
<body>
<div id="acc">
<input type="text" value="start" id="id1"/>
<input type="text" value="e0" id="id2"/>
</div>
<script>
myFunction();
function myFunction() {
document.getElementById("id1").value="1";
setTimeout(function(){
for(var i=0;i<=999999;i++){
document.getElementById("id2").value="e"+i;
}
document.getElementById("id1").value="2";
},5);
}
</script>
</body>
</html>
你可以尝试使用window.setInterval()
var id1 = document.getElementById("id1");
var id2 = document.getElementById("id2");
id1.value = 1;
var i = 0;
var t = setInterval(function() {
if (999999 < i) {
clearInterval(t);
id1.value = 2;
}
id2.value = 'e' + i;
i++;
}, 6);
<input type="text" value="start" id="id1" />
<input type="text" value="e0" id="id2" />
值已更新,只是在 JavaScript 执行完成之前屏幕不会更新(JavaScript 执行锁定 UI)。添加的控制台.log将打印您期望的内容:
myFunction();
function myFunction() {
console.log(document.getElementById("id1").value); // outputs "start" as expected
document.getElementById("id1").value = "1";
console.log(document.getElementById("id1").value); // outputs "1" as expected
var j = true;
for (var i = 0; j == true; i++) {
document.getElementById("id2").value = "e" + i;
if (i == 999999) j = false;
}
document.getElementById("id1").value = "2";
}
一种解决方案是将循环拆分为"块"。假设我们一次运行 1000 次迭代,然后使用 setTimeout
我们将接下来的 1000 次迭代安排在 1ms 后运行。我们重复此操作,直到我们遍历了整个集合:
myFunction();
function myFunction() {
// iterator which we count up each loop
var i = 0;
// set to initial value
document.getElementById("id1").value = "1";
function processDone() {
document.getElementById("id1").value = "2";
}
function processChunk() {
var maxLoopsPerCall = 1000;
while (maxLoopsPerCall-- > 0) {
document.getElementById("id2").value = "e" + i;
// if we're done, we call our done function and call return (so we don't schedule any more chunks
if (i == 999999) {
processDone();
return;
}
i += 1;
}
// schedule to process next chunk of the loop
setTimeout(processChunk, 1);
}
// schedule to process the first chunk of the loop
setTimeout(processChunk, 1);
}
http://jsfiddle.net/8kddxqmd/
相关文章:
- 如何在windows 8 html5现代用户界面中显示没有背景的图像
- 带图像的角度用户界面选择
- j查询用户界面按钮未显示
- 关于用户界面:目标跟踪和运动时间研究
- 如果在线检查期间发生电源故障,我们如何更新用户再次登录门户时的剩余时间
- 用户界面先前选择的选项选择更改
- 更新:用户错误-TYPO!!grunt contrib咖啡错误查找文件&写入目的地
- 更新用户's使用PHP或JavaScript链接
- 在我的html页面-web应用程序用户界面的一个选项卡中的另一个html页面中的选项卡
- 如何通过向用户推送模式引用来更新用户对象's数组字段
- 谷歌'soa架构-为谷歌聚合内容'的web用户界面
- 计算jquery用户界面的拖放
- 如何使用用户界面选择组筛选器属性
- 上传后更新用户配置文件图片
- 三.js:无法更改 dat 中的值.图形用户界面
- 无法初始化 dat.三.js中的图形用户界面
- 从图形用户界面生成 html
- JavaScript.代码未执行.用户界面未更新
- 合金用户界面 - 更新后获取记录
- 用户界面-最好的javascript框架的仪表板与实时更新