JavaScript。代码未执行。用户界面未更新
当更新用户界面的代码行在使系统忙碌一段时间的代码块之前执行时,UI不会更新。 请参阅下面的代码:JavaScript。代码未执行。用户界面未更新,javascript,user-interface,Javascript,User Interface,当更新用户界面的代码行在使系统忙碌一段时间的代码块之前执行时,UI不会更新。 请参阅下面的代码: myFunction(); 函数myFunction(){ document.getElementById(“id1”).value=“1”; var j=真; 对于(var i=0;j==true;i++){ document.getElementById(“id2”).value=“e”+i; 如果(i==999999) j=假; } document.getElementById(“id1
myFunction();
函数myFunction(){
document.getElementById(“id1”).value=“1”;
var j=真;
对于(var i=0;j==true;i++){
document.getElementById(“id2”).value=“e”+i;
如果(i==999999)
j=假;
}
document.getElementById(“id1”).value=“2”;
}
值会更新,只是在JavaScript执行完成之前屏幕不会更新(JavaScript执行会锁定UI)。添加的console.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);
}
值会更新,只是在JavaScript执行完成之前屏幕不会更新(JavaScript执行会锁定UI)。添加的console.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);
}
值会更新,只是在JavaScript执行完成之前屏幕不会更新(JavaScript执行会锁定UI)。添加的console.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);
}
值会更新,只是在JavaScript执行完成之前屏幕不会更新(JavaScript执行会锁定UI)。添加的console.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);
}
您需要使代码异步,如下所示
myFunction();
函数myFunction(){
document.getElementById(“id1”).value=“1”;
setTimeout(函数(){
对于(var i=0;i您需要使代码异步,如下所示
myFunction();
函数myFunction(){
document.getElementById(“id1”).value=“1”;
setTimeout(函数(){
对于(var i=0;i您需要使代码异步,如下所示
myFunction();
函数myFunction(){
document.getElementById(“id1”).value=“1”;
setTimeout(函数(){
对于(var i=0;i您需要使代码异步,如下所示
myFunction();
函数myFunction(){
document.getElementById(“id1”).value=“1”;
setTimeout(函数(){
对于(var i=0;i您可以尝试使用window.setInterval()
var id1=document.getElementById(“id1”);
var id2=document.getElementById(“id2”);
id1.value=1;
var i=0;
var t=setInterval(函数(){
如果(9999999
您可以尝试使用window.setInterval()
var id1=document.getElementById(“id1”);
var id2=document.getElementById(“id2”);
id1.value=1;
var i=0;
var t=setInterval(函数(){
如果(9999999
您可以尝试使用window.setInterval()
var id1=document.getElementById(“id1”);
var id2=document.getElementById(“id2”);
id1.value=1;
var i=0;
var t=setInterval(函数(){
如果(9999999
您可以尝试使用window.setInterval()
var id1=document.getElementById(“id1”);
var id2=document.getElementById(“id2”);
id1.value=1;
var i=0;
var t=setInterval(函数(){
如果(9999999
1
没有分配给id1
,因为您在for
循环之后立即分配了2
。是的,但是循环需要10秒。循环时我应该看到1。@Marc,您误解了直到javascript完成执行后屏幕才会更新……谢谢,这不是一个错误吗?怎么可能我对此进行了修正?@Marc Javascript执行不是同步的。它是单线程的。如果您想看到屏幕上的值发生变化,请将for
循环替换为setInterval
或递归setTimeout
,因为您正在将2
分配给它,因此1
没有分配给id1
在for
循环之后是的,但是循环需要10秒。循环时我应该看到1。@Marc,你误解了直到javascript完成执行后屏幕才更新。……谢谢,这不是一个错误吗?我如何纠正这个错误?@Marc javascript执行不是同步的。而且它是单线程的。替换 如果您想在屏幕上看到值的变化,请使用setInterval
循环或递归setTimeout